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 时,堆...
1.1 shared_ptr 参考:https://zh.cppreference.com/w/cpp/memory/shared_ptr std::shared_ptr是通过指针保持对象共享所有权的智能指针。多个shared_ptr对象可占有同一对象。下列情况之一出现时销毁对象并解分配其内存: 最后剩下的占有对象的shared_ptr被销毁; 最后剩下的占有对象的shared_ptr被通过operator=或reset(...
如果两个 std::shared_ptr 互相引用,形成一个循环,那么这两个 std::shared_ptr 所引用的对象就无法被正确释放。例如: struct Node { std::shared_ptr<Node> sibling; }; void foo() { std::shared_ptr<Node> node1(new Node); std::shared_ptr<Node> node2(new Node); node1->sibling = node2;...
shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象。标准库还定义了一个名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。 make_shared的标准库函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。与智能指针一样,ma...
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型的零)。当想传一个空指针,让程序调用特定重载函数,宏...
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...
与另一个 shared_ptr 或nullptr 进行比较 (函数模板) operator<< 将存储的指针的值输出到输出流 (函数模板) std::swap(std::shared_ptr) (C++11) 特化std::swap 算法 (函数模板) std::atomic_is_lock_free(std::shared_ptr)std::atomic_load(std::shared_ptr)std::atomic_load_explicit(std:...