问题背景:

C++项目中不得不提的就是指针,C++不像其他高级语言JAVA、Python等有自己的内存回收机制。C++的内存都需要开发自己来申请和释放,为了避免开发忘记释放自己申请的内存,C++引入了智能指针的概念,常见的智能指针有四种shared_ptr、weak_ptr、scoped_ptr、auto_ptr,实际项目中最常用就是shared_ptr,本篇文章中不详述这几种智能指针的关系和内部机制,后续出文章详述。本文主要讲实际项目中智能指针和裸指针混用导致的崩溃问题,主要常见就是两个指针或者多个智能指针值交换的时候用裸指针作为临时变量的话会导致程序崩溃或者异常。

问题代码:

为了还原项目中的实际问题,突出问题所在,基于实际情况做了写了下面测试代码来简化:

class CTest
{
public:
CTest(int id):m_ID(id){}
~CTest() { cout << "delete!!" <<endl;}
int getID() {return m_ID;}
private:
int m_ID;
};
int _tmain(int argc, _TCHAR* argv[])
{
shared_ptr<CTest> pTestA = make_shared<CTest>(100);
shared_ptr<CTest> pTestB = make_shared<CTest>(200);

cout << "交换前:" << endl;
cout << pTestA->getID() << endl;
cout << pTestB->getID() << endl;

CTest* pTempC = pTestB.get();
pTestB = pTestA;
pTestA.reset(pTempC);

cout << "交换后:" << endl;
cout << pTestA->getID() << endl;
cout << pTestB->getID() << endl;
return 0;
}

上述代码要实现pTestA和pTestB交换,咋一看好像代码没啥问题,为了突出问题原因在CTest的析构函数加了输出语句,运行上面的测试代码运行结果如下:

上述代码并没有实现pTestA和pTestB的交换,原因就是中间临时变量用了裸指针,因为虽然上一句CTest* pTempC = pTestB.get()被赋值给裸指针pTempC ,但pTestB 指向的内存引用计数还是为1,当执行pTestB = pTestA;这句话的时候,pTestB 的引用计数会被置为0,从而导致pTestB 以前指向的内存被释放掉(调用了析构输出了delete),此时pTempC已经是野指针了,再后面赋给pTestA时就值已经是乱码了,导致程序崩溃。

问题解决:

不要裸指针跟智能指针混用,统一用智能指针即可解决上述崩溃问题。修改代码如下及运行结果如下:

shared_ptr<CTest> pTempC = pTestB;
pTestB = pTestA;
pTestA = pTempC;

【厚积薄发系列】C++项目总结13—智能指针和裸指针混用导致的崩溃问题相关推荐

  1. C++(9)--裸指针、智能指针、引用

    指针 1.裸指针的基本概念 1.1 裸指针的声明*/初始化& 1.2 操作裸指针--间接运算符* 1.3 裸指针使用 demo--指向一个简单变量 1.4 空指针--nullptr 1.5 特 ...

  2. 【c++】4.std::shared_ptr、std::make_shared、 .get() 、.data()、void *p 的用法、裸指针

    std::shared_ptr.std::make_shared. .get() ..data().void *p 的用法.裸指针 (1)shared_ptr能够记录对象被引用的次数,主要被用来管理动 ...

  3. 【C++】RAll,裸指针,弃用auto_ptr原因

    文章目录 什么是RAll? 1. RAll的原理: 1.1 资源的获取一般分为三个阶段: 1.2 资源的销毁往往是程序员经常忘掉的环节,所以程序界就想,如何才能让资源自动销毁? 裸指针 什么是裸指针? ...

  4. 【厚积薄发系列】C++项目总结19—组件化架构思想

    在一个大型的项目中,随着业务不断拓展,开发人员和代码量的不断增加,传统的单体架构会经常遇到以下问题: 1.业务模块划分不够清晰,模块之间高度耦合,修改和新增需求的时候可能会导致牵一发而动全身的雪崩. ...

  5. 【厚积薄发系列】C++项目总结12—函数调用约定导致的崩溃问题分析

    问题背景: 当时所在的项目集成准备发版的前几天,突然测试发现了一个崩溃问题.接到这个bug后,发现以前的版本是没有,可以确定这问题肯定是由于这几天开发提交的代码引起的.经过这几天版本二分法确定了首次出 ...

  6. 【花雕动手做】有趣好玩的音乐可视化系列小项目(17)--光导纤维灯

    偶然心血来潮,想要做一个声音可视化的系列专题.这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累 ...

  7. 【花雕动手做】有趣好玩的音乐可视化系列小项目(19)--通体光纤灯

    偶然心血来潮,想要做一个音乐可视化的系列专题.这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累 ...

  8. 【花雕动手做】有趣好玩的音乐可视化系列小项目(18)--LED平面板灯

    偶然心血来潮,想要做一个音乐可视化的系列专题.这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累 ...

  9. 【花雕动手做】有趣好玩的音乐可视化系列小项目(14)---水杯水瓶灯

    偶然心血来潮,想要做一个声音可视化的系列专题.这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累 ...

最新文章

  1. CVPR 2022 | 室外多模态3D目标检测(DeepFusion)
  2. shell grep 变量_Shell应用:巧用xargs 轻松实现上万文件的筛选压缩
  3. React应用渲染界面的入口
  4. 超级马里奥代码_任天堂的源码泄露,揭示超级马里奥的前世之生
  5. 流畅的Python 1. Python数据模型(特殊方法 __func__())
  6. 聚类算法的java实现_聚类算法之BIRCH(Java实现)
  7. Prime Gap(POJ-3518)
  8. web.config 学习之httpHandler
  9. Cisco STP生成树协议
  10. [导入]刚拿积蓄救人 自己又患癌症(我身边的一个真实故事)
  11. 保姆级教学,起点中文网字体反爬。
  12. SysML实践指南第二版(中文翻译:刘亚龙)第一章 系统工程基础
  13. 计算机基础excel操作试题,大学计算机基础 excel测试题 求答案~~喵~~
  14. P3110 [USACO14DEC]驮运Piggy Back-最短路,spfa
  15. Arduino和LabVIEW射频校园火警系统
  16. unity blend混合
  17. 验证手机号邮箱,多个以英文逗号分隔
  18. Luxurious Houses - CodeForces - 581B
  19. 华为云视频点播服务全面开放公测!限量发放VIP免费名额中...
  20. Hadoop 笔记(五)配置历史服务器

热门文章

  1. 快鲸智慧社区平台:快速提升“智慧社区”服务水平
  2. android获取多媒体库的视频、音频、图片
  3. oracle 00002,EXP-00002错误,求助
  4. 老衲躺地上都中枪的“ = + ”
  5. 工具_SETUNA2、3下载,截图小工具,SETUNA github下载
  6. 蛋白质一级结构全局比对 Needleman-Wunsch 算法的 Python 实现
  7. 关于ITSS的一些问答......
  8. HCIA网络课程第四周作业
  9. 计算机硬盘 优盘等存储部件的信息,计算机硬盘、优盘等存储部件的信息,即使经一般数据删除或格式化处理后,仍可以通过技术手段将其中的涉密信...
  10. [译]36 Days of Web Testing(一)