c++ new delete 常踩的坑

由new 和delete引发的bug , coredump , 让多少程序员加了多少班。

作者:aaron,腾讯后台开发 高级工程师

商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。

 

WeTest 导读

 

c++ 是公司开发最常用的语言之一, 那New和Delete 这两个函数是所有开发者即爱又恨的函数。由new 和delete引发的bug , coredump , 让多少程序员加了多少班。

 


 

 

遇到的问题

C++ 中,你也许经常使用 new 和 delete 来动态申请和

● 释放内存,但你可曾想过以下问题呢?

● new 和 delete 是函数吗?

● new [] 和 delete [] 又是什么?什么时候用它们?

● 你知道 operator new 和 operator delete 吗?

 

为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?

 

发现的代码 

有时看到代码是这么写的: 

 

这样有问题吗 ?    在服务器上长期运行,会引起内存泄漏吗? 

 

写了个测试程序, 看看这些都是神马。 

 

 

程序运行结果:

 

 

注意这里多出来的 4字节

 

总结

 这个问题直接导致我们需要在 new [] 一个对象数组时,需要保存数组的维度,C++ 的做法是在分配数组空间时多分配了 4 个字节的大小,专门保存数组的大小,

在 delete [] 时就可以取出这个保存的数,就知道了需要调用析构函数多少次了。

  

 

 

 

c++对象内存分配与释放

 有人提出两个问题:

       1、那个4字节在 delete [] , 是怎么跳过的。

       2、free 是怎么知道自己的长度。

 

  以下写几个栗子 看一下:

 

delete 对象  :

 

部分汇编码如下:

delete复杂数据类型先调用析构函数再调用operator delete。

 

c++的内存分配    

看一下 M$ 编译器是如何构造和释放内存的 

 

 

小的总结 

内存分配一般有两种方式: 
1 非入侵式,内存分配器自行先申请内存(和栈配合使用),用作记录用户层的申请记录(地址,大小)。 用户释放空间时会查找该表,除了知道释放空间大小外还能判断该指针是合法。


2 入侵式,例如用户要申请1byte的内存,而内存分配器会分配5byte的空间(32位),前面4byte用于申请的大小。释放内存时会先向前偏移4个byte找到申请大小,再进行释放。

两种方法各有优缺点,第一种安全,但慢。第二种快但对程序员的指针控制能力要求更高,稍有不慎越界了会对空间信息做成破坏。


绝大多数的分配器会采用第一种方式实现,而操作系统级的分配器采用了虚拟等方式,可能要记录更多信息。

 

最后分析自定义数组类型 

那么数组的分配和释放是 怎么自动的 增加 4 字节 和 减 4字节的呢?

 

实在不想看了 ,贴一点 关键的吧 , New 对象的部分汇编

 

上面的汇编码流程大致是:

1、调用operator new分配堆空间

2、调用构造代理函数构造堆对象,在调用构造代理函数时,通过压栈,像其传递了5个参数,分别是 a)第一个堆对象首地址 b)堆对象大小c)堆对象个数 d)构造函数地址 e)析构函数地址

3、传回第一个堆对象首地址,而不是申请到的堆空间首地址

 

析构的部分代码

看看析构函数是如何自动偏移4字节的。 

 

 

 以上的汇编似乎没有涉及 4字节的偏移 , 那看看  vector deleting destructor 这个函数干了啥

 

看到  operator delete[] (0341244h) 这个函数了 , 前面将 对象首地址 -4  ,然后释放内存, 现在知道为啥 析构偏移4字节了吧 

 


 

关于腾讯WeTest (wetest.qq.com)

 

腾讯WeTest是腾讯游戏官方推出的一站式游戏测试平台,用十年腾讯游戏测试经验帮助广大开发者对游戏开发全生命周期进行质量保障。腾讯WeTest提供:适配兼容测试;云端真机调试;安全测试;耗电量测试;服务器性能测试;舆情分析等服务。

点击地址:http://wetest.qq.com/立即体验!

 

最新文章
1客户案例研究:专家安全扫描,守护金融银行小程序安全和私密性 WeTest私有化部署的定制扫描平台让金融银行客户能无成本接入扫描系统并迅速上手使用。客户能方便快捷地根据定制手册进行自助扫描,根据生成的扫描报告,详细洞察漏洞,快速识别并准确定位问题根源。
2客户案例研究:专家渗透测试,洞察电子商务小程序重大交易漏洞 通过WeTest渗透测试服务,某知名零售公司旗下的在线购物类小程序中发现了8处安全风险,我们的安全专家为客户提供了详细的漏洞报告,提供了较为清晰完整的安全加固方案。在回归测试中,中危以上风险均被解决。
3自查小程序4大安全隐患!文末免费赠送小程序安全扫描专业版! 腾讯WeTest现面向小程序开发者开放免费申请使用小程序安全扫描专业版,助您提前发现全面的安全漏洞。扫描文中问卷二维码或点击问卷链接,即可报名参与免费领取活动。
4浅谈渗透测试服务在泛互行业带来的价值 在泛互联网行业中,渗透测试服务对于保障企业的网络安全至关重要。
5云手机卡顿/无特定设备/商店登录受限怎么办?WeTest专有云帮您解决! 公有云满足了大量小微企业、个人的测试需求;随着客户深入使用,也遇到了一系列新问题。本篇将对几个常见问题予以解答
购买
客服
反馈