std::shared_ptr , 允许多个指针指向同一个对象
std::unique_ptr, 独占所指向的对象。
std::unique_ptr 是 c++11中用来取代 std::auto_ptr 指针的指针容器。 它不能与其他unique_ptr类型的指针对象共享所指对象的内存。这种所有权仅能够通过std::move函数来转移。unique_ptr是一个删除了拷贝构造函数、保留了移动构造函数的指针封装类型。
初始化quniue_ptr
std::unique_ptr<int> int_ptr(new int(10));
或者reset()
std::unique_ptr<int> int_ptr;
int* test_pointer = new int(10);
int_ptr.reset(test_pointer);
或者move 转换所有权
std::unique_ptr<int> int_ptr_1(new int(10));
std::unique_ptr<int> int_ptr;
int_ptr = std::move(int_ptr_1);
释放原来对象的联系
调用release 会切断unique_ptr 和它原来管理的对象的联系。release 返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。如果不用另一个智能指针来保存release返回的指针,程序就要负责资源的释放。
release 释放对指针的控制权,返回指针,并将置为空。
#include <iostream>
#include <memory>int main() {std::unique_ptr<int> uptr(new int(10)); //绑定动态对象//std::unique_ptr<int> uptr2 = uptr; //不能賦值//std::unique_ptr<int> uptr2(uptr); //不能拷内std::unique_ptr<int> uptr2 = std::move(uptr); //轉換所有權if(uptr == nullptr)printf("uptr give up *int\n");int * p = uptr2.release(); //uptr2释放对指针的控制权,返回指针,并将uptr2置为空if(uptr2 == nullptr)printf("uptr2 give up *int\n");printf("%d\n", *p);delete p;return 0;
}
输出结果:
uptr give up *int
uptr2 give up *int
10