在c++中,动态内存管理是通过new/delete 运算符来进行的。由于确保在正确的时间释放内存是很困难的,为了避免内存泄漏,更加容易,安全地使用动态内存,C++11标准库提供了两种智能指针类型来管理动态对象。只能指针的行为类似于常规指针,重要的区别是它负责自动释放所指的对象。
std::shared_ptr , 允许多个指针指向同一个对象
std::unique_ptr, 独占所指向的对象
std::unique_ptr 是 c++11中用来取代 std::auto_ptr 指针的指针容器。 它不能与其他unique_ptr类型的指针对象共享所指对象的内存。这种所有权仅能够通过std::move函数来转移。unique_ptr是一个删除了拷贝构造函数、保留了移动构造函数的指针封装类型。
调用release 会切断unique_ptr 和它原来管理的对象的联系。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 "); int * p = uptr2.release(); //uptr2释放对指针的控制权,返回指针,并将uptr2置为空 if(uptr2 == nullptr) printf("uptr2 give up *int "); printf("%d ", *p); delete p; return 0; }
输出结果:
[daq@centos build]$ ./hello-exe/cmake-good uptr give up *int uptr2 give up *int 10