参考:https://zh.cppreference.com/w/cpp/memory/shared_ptr std::shared_ptr是通过指针保持对象共享所有权的智能指针。多个shared_ptr对象可占有同一对象。下列情况之一出现时销毁对象并解分配其内存: 最后剩下的占有对象的shared_ptr被销毁; 最后剩下的占有对象的shared_ptr被通过operator=或reset()赋值为另一指针。
1.原始指针不能直接使用赋值运算符对shared_ptr进行赋值运算 std::shared_ptr<int>p; p=newint(1);//errorp.reset(newint(1);//success 2.shared_ptr默认情况下不支持对数组内存的管理 std::shared_ptr<int> p(newint[10],[](int*P){delete[] p;}); std::shared_ptr<int> p(newint[10],std:...
1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾. 2.auto_ptr防止拷贝后析构释放同一块内存,采用"转移所有权"的方法.(实际开发中auto_ptr并不实用) 3.scoped_ptr与auto_ptr类似,但是它与auto_ptr最大的区别是:它不能转移所有权,即就是禁止拷贝/赋值!(当然,我们也探讨...
cout<<"test shared_ptr deleter:"<<endl; int*p7=newint(1024); shared_ptr<int>p8(p7,print_at_delete); p8=make_shared<int>(1025); unique_ptr unique_ptr基本用法 unique_ptr对于所指向的对象,正如其名字所示,是独占的。所以,不可以对unique_ptr进行拷贝、赋值等操作,但是可以通过release函数在unique...
有关shared_ptr最重要的可以说是引用计数的功能了,这也是为什么命名为shared,因为它可以实现多个指针指向同一个对象。当同类型的shared_ptr发生拷贝或者赋值操作的时候,会将原指针中的引用计数增加,当一个shared_ptr中引用计数变为0的时候,该对象会被释放。
因此weak_ptr可以在这两种场景下使用。 构建 weak_ptr可以通过shared_ptr构建以及赋值 shared_ptr<ClassA> spA(new ClassA); weak_ptr<ClassA> wpA1(spA); weak_ptr<ClassA> wpA2 = spA; 1. 2. 3. expired函数 weak_ptr并不增加shared_ptr的引用计数,因此有可能发生对象已经析构但是weak_ptr还在的情况...
std::shared_ptr:通过内部引用计数自动管理对象的生命周期。当一个std::shared_ptr被复制或赋值时,它所指向的对象的引用计数会增加;当std::shared_ptr被销毁或重新赋值时,引用计数减少。当引用计数降到0时,对象被自动销毁。 简化内存管理:使用智能指针,开发者不需要显式地管理对象的创建和销毁,大大降低了内存泄露...
注意,同一普通指针不能同时为多个 shared_ptr 对象赋值,否则会导致程序发生异常。例如: 4) 在初始化 shared_ptr 智能指针时,还可以自定义所指堆内存的释放规则,这样当堆内存的引用计数为 0 时,会优先调用我们自定义的释放规则。 在某些场景中,自定义释放规则是很有必要的。比如,对于申请的动态数组来说,shared_pt...
unique_ptr是一种具有类似功能的新设施,但具有改进的安全性(无伪造副本分配),增加的功能(删除器)和对阵列的支持。它是原始指针的容器。它显式地防止了其复制的指针的复制,这与正常赋值会发生的情况相同,即它只允许底层指针的一个所有者。 因此,当使用unique_ptr时,任何一种资源最多只能有一个unique_ptr,并且当...
创建unique指针声明很普通,而特殊点在于,其是独享被管理对象的,不允许两个指针同时指向(如果这样操作会报错),而想要赋值就只可以使用移动语义move将其所有权进行转移,而且转移后原有指针失去指向。 shared_ptr:shared_ptr也在实际应用中广泛使用。它的原理是使用引用计数实现对同一块内存的多个引用。在最后一个引用被...