内存管理之智能指针unique_ptr&weak_ptr

unique_ptr:

1.unique_ptr与shared_ptr不同,某个时刻只能有一个unique_ptr指向给定的对象,当unique_ptr被销毁时,其所指向的对象也被销毁,和shared_ptr一样,unique_ptr默认使用delete释放指向的对象
 
2.unique_ptr初始化
1.不初始化,返回一个内容为nullptr的unique_ptr
unique_ptr<类型> 指针名;
2.使用内置类型指针直接初始化
unique_ptr<类型> 指针名(内置类型指针p); 这里的p --> 类型* p = new 类型()
unique_ptr<类型> 指针名(new<类型>())//unique_ptr与new结合使用

3.unique_ptr独占指向的对象,不支持赋值和拷贝操作

例子:
unique_ptr<string> p1(new string("hello,world")); // 正确,直接初始化
unique_ptr<string> p2(p1); // 错误,unique_ptr不支持拷贝操作
unique_ptr<string> p3; // 正确,返回一个内容为nullptr的unique_ptr
p3 = p1; // 错误,unique_ptr不支持赋值操作

4.了解reset()和release()方法

虽然不能拷贝或者赋值,但是可以通过reset()和release()方法将指针的所有权从一个unique_ptr转移给另一个unique_ptr
例子:
unique_ptr<string> p1(new string("hello,world"));
unique_ptr<string> p2(p1.release()); // p1将所有权转移给p2,release将p1置空
unique_ptr<string> p3(new string("hi,china"));
p3.reset(p2.release()); // p2将所有权转移给p3,reset释放原p3内存,然后重新拥有新的对象的所有权
 
详细了解:参看c++ primer 5 Edition P418
 
5.特别之处:传递unique_ptr参数和返回unique_ptr
unique_ptr不能拷贝或赋值有一个例外,但是可以拷贝或者赋值将要被销毁的unique_ptr
 
weak_ptr:(弱共享)

1.weak_ptr不能控制所指向对象的生存期的智能指针,其指向一个shared_ptr管理的对象
 
2.将weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数
 
3.当最后一个shared_ptr被销毁,即使有weak_ptr指向该对象,对象也会被销毁
 
4.weak_ptr初始化:初始化方式和shared_ptr方式一样,而且weak_ptr和shared_ptr之间可以相互初始化,唯一不同的是,weak_ptr的使用要用lock()方法
 
5.weak_ptr不能直接访问对象,必须使用lock()方法,要检查weak_ptr指向的对象是否存在
原文地址:https://www.cnblogs.com/zhang716921/p/10626737.html