前言
智能指针的出现大大减轻了 C++
程序员的心理负担(最少对于我是这样的),不用再时时刻刻担心一个 new
出来的指针是否被 delete
的问题了。虽然智能指针很强大,但是如果用不好,还是会导致各种各样的问题。最近,在项目里看到了几种智能指针的典型错误用法。有的严重,有的轻,有的问题在研发阶段并没有立刻暴露出来,埋下了一颗定时炸弹。趁着这个机会,总结一下几种常见的错误用法。希望对各位小伙伴儿有帮助。
说明:智能指针有很多种,标准库提供了几种,比如最常用的 shared_ptr
和 unique_ptr
, 比较少用的 weak_ptr
以及被废弃的 auto_ptr
。项目代码里还有一种基于引用计数的智能指针。本文只列举几种常见的错误用法,不会深入到各种智能指针的实现。如果想深刻理解智能指针的用法,一定要看源码。
错误用法
在列举各种错误用法之前,想说明一点:这些错误都是实际遇到过的,并不是凭空想出来的。所以,即使有些示例代码错的是那么明显,也请不要轻视。
1. 同一指针交给两个智能指针管理导致二次释放
1 | namespace case1 |
2. 错误的动态转换导致的二次释放
1 |
|
3. 返回智能指针管理的原生指针
1 |
|
4. 类中的成员变量指针交给外部智能指针管理
1 | namespace case4 |
5. 栈变量的地址交给智能指针管理
1 | namespace case5 |
6. 循环引用导致的内存泄漏
1 |
|
示例代码
完整的示例代码下载地址
CSDN:https://download.csdn.net/download/xiaoyanilw/13203123
百度云:https://pan.baidu.com/s/1dFUKevDXJZfja3HyO-jazg 提取码: 8ra8
总结
以上示例代码虽然有的看起来非常不可思议,这是我简化后的结果,在实际代码中经常以另外一种形式出现,一不小心就容易中招。