1 - 智能指针概述
本文将对三种智能指针shared_ptr
,unique_ptr
和weak_ptr
做一些简要介绍。
为什么要有智能指针
内存管理是C++中常见的错误和bug来源,例如直接用new和delete容易导致内存泄漏。而智能指针可帮助管理动态分配的内存,这是避免内存泄漏建议采用的技术。
智能指针可用于管理在函数作用域/类的数据成员内动态分配的资源,也可以通过函数实参来传递动态分配的资源的所有权。
查看以下代码,它看起来是安全的,实则不然:
void couldBeLeaky()
{
Simple* pSimple = new Simple();
pSimple->doSth();
delete pSimple;
}
如果doSth()
方法抛出了一个异常,将永远不会调用 delete,导致内存泄漏。
因此使用智能指针是十分重要的。
智能指针的种类
对于普通的裸指针,可以单独占用一块内存,也能多个指针共享一块内存,太灵活了以致于可能会发生内存问题。
智能指针主要有以下三种:
- 独享型智能指针
unique_ptr
:同一块堆内存只能被一个unique_ptr
拥有 - 共享型智能指针
shared_ptr
:同一块堆内存可以被多个shared_ptr
拥有 - 弱引用智能指针
weak_ptr
:也是一种共享型智能指针,可以视为对shared_ptr
的一种补充
注意事项
- 智能指针和裸指针不能混用。
- 能使用智能指针就尽量使用智能指针,且能用
unique_ptr
就用它。必须用C语言指针的情况包括:- 网络传输函数:例如windows下的send,recv
- C语言的文件操作部分:传统C语言的文件操作
- 传统C风格数组:智能指针对传统C风格数组的支持不是很好
参考资料
- 飘零的落花 - 现代C++详解
- C++20高级编程