T *ptr_{nullptr}; ref_count *rep_{nullptr}; };template<typenameT,typename... Args>automake_Shared(Args &&...args){returnShared_ptr<T>{newT(std::forward(args)...)}; }
值得一提的是,和 unique_ptr、weak_ptr 不同之处在于,多个 shared_ptr 智能指针可以共同使用同一块堆内存。并且,由于该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为 0 时,堆...
weak_ptr是一个弱引用,它是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是说,它只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向...
1.1 shared_ptr 参考:https://zh.cppreference.com/w/cpp/memory/shared_ptr std::shared_ptr是通过指针保持对象共享所有权的智能指针。多个shared_ptr对象可占有同一对象。下列情况之一出现时销毁对象并解分配其内存: 最后剩下的占有对象的shared_ptr被销毁; 最后剩下的占有对象的shared_ptr被通过operator=或reset(...
shared_ptr独有的操作解释 make_shared 返回一个shared_ptr,指向一个动态分配的类型为T的对象。使用args初始化此对象 shared_ptr p是shared_ptr q的拷贝;此操作会递增q中的计数器。q中的指针必须能转换为T* p = q p和q都是shared_ptr,所保存的指针必须能相互转换。此操作会递减p的引用计数,递增q的引用计数...
在释放堆内存后,应立即将指针置为nullptr,防止悬挂指针。例如:使用const修饰常量指针,可以防止指针指向的值被意外修改。例如:这里ptr是一个常量指针,指向一个常量int,其指向和指向的值都不能被修改。尽量避免使用多级指针嵌套,因为这会增加代码的复杂性和出错的可能性。如果确实需要使用多级指针,应确保逻辑清晰...
template<class T> struct Delete { void operator()(T* ptr) { cout << "delete:" << ptr << endl; delete ptr; } }; template<class T, class D = Delete<T>> class shared_ptr { public: shared_ptr(T* ptr = nullptr) : _ptr(ptr) , _pCount(new int(1)) {} void Release() { ...
5.1 shared_ptr模拟代码 template<class T>class shared_ptr{public:shared_ptr(T* ptr = nullptr): _ptr(ptr), _pCount(new int(1)){}void Release(){if (--(*_pCount) == 0) // 防止产生内存泄漏,和析构一样,写成一个函数{delete _ptr;delete _pCount;}}~shared_ptr(){Release();}shared...
unique_ptr:这是一种独占所有权的智能指针。在任何时候,只能有一个unique_ptr指向一个对象。当这个unique_ptr被销毁时,它所指向的对象也会被删除。 weak_ptr:这是一种不控制对象生命周期的智能指针。它是为了解决shared_ptr可能导致的循环引用问题而设计的。
weak_ptr指针通常不单独使用,只能和 shared_ptr 类型指针搭配使用,可以作为shared_ptr类内的对象。 unique_ptr unique_ptr 是一个独享所有权的智能指针,它提供了严格意义上的所有权。 nullptr NULL是一个宏,它被定义为0(也就是int型的零),或者0L(long型的零)。当想传一个空指针,让程序调用特定重载函数,宏...