聊聊 C++ 中的几种智能指针 (下)
一:背景上一篇我们聊到了C++ 的auto_ptr ,有朋友说已经在 C++ 17 中被弃用了,感谢朋友提醒,今天我们来聊一下 C++ 11 中引入的几个智能指针。
[*]unique_ptr
[*]shared_ptr
[*]weak_ptr
看看它们都怎么玩。
二:三大智能指针详解
1. unique_ptr
上一篇在说 auto_ptr 的时候聊过一个术语叫 控制权转移,言外之意就是下面的代码会 访问违例 。
void test() {
int* i = new int(10);
auto_ptr<int> ptr1(i);
auto_ptr<int> ptr2 = ptr1;//将 ptr1 的控制台送给了 ptr2
cout << *ptr1 << endl;
}
int main() {
test();
}https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2ca1c52e635d4b239a627e504dbac753~tplv-k3u1fbpfcp-zoom-1.image
接下来可以在 main 方法结束的地方观察 a,b 所有的 heap 块的内存内容是否被释放? 可以清楚的看到还在那里。。. 如下图所示:
https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ed4364fbb4cb4f34aadd4727809b7e03~tplv-k3u1fbpfcp-zoom-1.image
这就是 循环引用 造成的问题,这时候就需要用到 weak_ptr 了。
3. weak_ptr
弱引用就是它的引用不改变对原对象中 _Uses 的引用,接下来将 AClass 和 BClass 中的 shared_ptr 改成 weak_ptr 版。
class unique_ptr {
public:
unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
};https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/21dd327651314719a75c740e8a7bf78e~tplv-k3u1fbpfcp-zoom-1.image
从图中可以看到,此时 refcnt=1, 再观察下地址 0x007f71a8 的内容,可以发现已经被释放啦。
https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4f4f4da35a99485db828717dd7d506a7~tplv-k3u1fbpfcp-zoom-1.image
好了,今天我们就聊这么多,希望对大家有帮助。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]