首先,通过shared_ptr的reset()方法减少引用计数,并确保对象只被当前的shared_ptr持有。 当确认shared_ptr的引用计数为1时,可以使用std::move将其转换为unique_ptr。 当shared_ptr引用计数为1时,使用std::move将其转为unique_ptr: 使用std::move可以将shared_ptr的所有权转移给unique_ptr,从而完成转换。 示例代...
unique_ptr 指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过 reset 方法重新指定、通过 release 方法释放所有权、通过移动语义转移所有权,unique_ptr 还可能没有对象,这种情况被称为 empty。[6] ^{[6]} [6] 。 unique_ptr的基本操作有: //智能...
std::unique_ptr<MyClass> uptr = std::make_unique<MyClass>(); // 3.转移所有权 int* raw_ptr = new int(10); std::unique_ptr<int> uptr(raw_ptr); // 如果uptr已有对象,先释放旧对象,再转移所有权 uptr.reset(raw_ptr); 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 2....
shared_ptr可以安全地放到标准容器中,并弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。 #include <string> #include <iostream> #include <boost/shared_ptr.hpp> class implementation { public: ~implementation() { std::cout <<"destroying implementation\n"; } void do_something() { std...
由于unique_ptr的语义是唯一拥有ownership,那只要对他执行move操作就能把ownership转移出去给shared_ptr std::unique_ptr<Widget> a = std::make_unique<Widget>();std::shared_ptr<Widget> b = std::move(a);这样a就等价于nullptr,而b则指向了堆中的Widget对象,切count=1。Q:shared_ptr转换...
函数声明:void swap (shared_ptr& x) noexcept;参数x: 另一个相同类型的 shared_ptr 对象(即,具有相同的类模板参数 T)。作用是将 shared_ptr 对象的内容与 x 的内容交换,在它们之间转移任何托管对象的所有权,而不会破坏或改变两者的使用计数。 用法举例: ...
unique_ptr, 如其名字,是内存资源的唯一指针,不可以复制、赋值,只能转移。那具体使用包括创建、move和release操作。 1.1 创建unique_ptr指针的方法如下: std::unique_prt<int> unique_ptr_p1;//创建了一个没有指向任何内存的unique_ptr, 为nullptr std::unique_ptr<int> unique_ptr_p2(new int);//创建的指...
前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针,顾名思义,有个shared表明共享嘛.所以shared_ptr类型的智能指针可以做为STL容器的元素 ...
auto_ptr这是C++98标准下的智能指针,现在常常已经被C++标准的其他智能指针取代。它的缺点是在转移所有权后会使运行期不安全。C++11新标准,用unique_ptr来代替auto_ptr原有功能。 auto_ptr <double> pd; double *p_reg = new double; pd = p_reg; // 不允许 ...
使用转移语义避免unique_ptr误用 利用unique_ptr的移动语义(move semantics),而非拷贝,来传递资源的所有权。 破坏循环引用 使用weak_ptr:当不需要增加引用计数时,使用weak_ptr来监视shared_ptr而不增加其引用计数,可以打破潜在的循环引用。 重新设计数据结构:避免不必要的相互引用,或使用其他设计模式(如观察者模式)来...