关于内存回收+为什么使用智能指针
毕业以来也换了几份工作了,大部分在搞C++,做过上位机【MFC、QT、C#..】,做过纯C++后台【企业存储】。在某XX公司做纯C++时,真正摆脱了界面开发。以前没接触过的C++11也有所了解,不至于老牛啃南瓜无从下口。
在做过好几个MFC和QT的项目后,一直想接触C++的东西,可是没机会,就在网上找,智能指针、设计模式、数据结构。。可是这些东西很难应用到项目中,强行加入完全就是冗余毫无用处。
直到最近拿到一个demo做二次开发,demo是别人写了个模板在那里,我需要的是读懂代码,增加功能。
项目主要功能:一个MFC工程,操作一个线性相机,相机提供dll和api,将相机采集的图像数据全部存入内存堆中,然后根据设置长宽把图片剪切成一张张jpg存到磁盘。用一个线程采集总的图片数据,把总的图片数据切成一张张数据,然后多个线程来一张张数据落盘。
这个项目让我印象深刻的是
1、内存的回收:
struct* a = new A;
byte* b = new byte[n];
a->data = b;
delete a;
delete []b;
ps:数据的new是在1线程,但是释放在2线程。new就是在堆上分配一段空间,如果没有释放,这段空间会被一直占用,时间久了就没有可用的空间了,delete就是告诉系统,这段空间可以被后面的代码使用了。new和delete可以在不同的函数、线程,它们对象是同一片地址空间,但是在一个流程里一定要去释放。我感觉这可能就是C++或者C这种带指针的语言的弊端,如果在同一函数中new和delete成对出现,我们可能很好维护,看代码的人也好懂,但是往往很多项目需要上面那个那样,使用多个线程去同时工作提高效率,所以往往找不到对应的new或者delete。
2、智能指针
我看了某XX的大佬们写的代码,几乎没用到裸露的指针,全是智能指针包裹的。直到现在我也不能很深刻的明白到底有啥用。结合上面的工程,好像能想明白:
假设堆上面有片图片数据空间,有两个地方都要去释放它,a释放完之后,这篇空间已经被标记为已释放,此时如果b还想去释放,肯定会出错。而智能指针就是告诉系统,如果还有栈上面的指针指向这个堆空间,a释放的时候就不释放,这样b或者其他对象就能访问这个空间。【仅仅是猜测,感觉用处没想象中大】
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html