智能指针
-
auto_ptr
已被弃用.- 函数传递时控制权被转移,会导致野指针问题
- 不能正确释放数组对象资源
-
shared_ptr
解决 auto_ptr 上述两个问题,采用引用计数原理,当一个对象引用计数为 0 时才被析构,且可以自定义析构器。- 当用同一个裸指针构建两个 shared_ptr 对象时,这两个对象引用计数都为1,会出现多次析构同一片内存区域的情况
- 无法解决循环引用的问题(会导致内存泄漏)
note:尽量避免使用裸指针,尽量使用 make_shared(有性能优化)
-
weaked_ptr
共享语义和不包含语义,共享 shared_ptr 持有的资源,不包含语义是指 weaked_ptr 本身不包含资源,所以无法用 * 和 -> 操作,可以用 .lock() 方法获取其 shared_ptr 对象
解决循环引用问题,引入强引用计数和弱引用计数,当 strong_ref = 0 weaked_ptr = 1时不会再次释放资源,weaked_ptr 循环引用时,只是 weaked_ref 加一
当 weaked_ptr 指向的 shared_ptr 资源释放后,weaked_ptr 会失效(expired)- 好像没什么缺点
-
unique_ptr
unique_ptr遵循着独占语义。在任何时间点,资源只能唯一地被一个unique_ptr占有。当unique_ptr离开作用域,所包含的资源被释放。如果资源被其它资源重写了,之前拥有的资源将被释放
当把unique_ptr赋给另外一个对象时,资源的所有权就会被转移
unique_ptr 只支持移动语义,不支持复制语义
release() 和 reset() 区别:前者只释放所有权,后者还可能释放资源
关于 unique_ptr 和 shared_ptr 选取:
完全取决于你想要如何拥有一个资源,如果需要共享资源使用 shared_ptr ,如果独占使用资源就使用 unique_ptr.
除此之外,shared_ptr 比 unique_ptr 更加重,因为他还需要分配空间做其它的事,比如存储强引用计数,弱引用计数。而unique_ptr不需要这些,它只需要独占着保存资源对象。
关于 为什么非要用智能指针:
并不只是为了方便管理内存,手动的释放内存容易被打断,比如 new 和 delete 之间有异常流导致程序退出,delete 并不会被执行,所以智能指针主要还是为了内存安全。
refer to : https://www.jianshu.com/p/e4919f1c3a28 讲得很清楚
实现原理: https://www.jianshu.com/p/b6ac02d406a0
weaked_ptr 使用: https://www.jianshu.com/p/313fd0f3692d
shared_from_this: https://blog.csdn.net/zk3326312/article/details/79108690
内存泄漏检测工具:
valgrind --tool=memcheck --leak-check=yes --leak-check=full ./app

浙公网安备 33010602011771号