关于C++ delete和delete[]的一点看法

 这周工作中感觉自己需要修改的代码基本已经差不多了,就想找个工具检测一下代码看看有没有内存泄漏,这种错误在c++新手中常犯,而且难以察觉,于是乎就找了个在linux下比较常用的valgrind来检测,结果发现了原来代码中有部分用new[]申请的变量但是会用delete释放,而不是c++标准教科书中强调的new/delete和new[]/delete[]的配对。工具虽然查出了这个错误,但是结果确并没有说有memory leak.这一点让我觉得很奇怪,于是通过网上查阅,翻书和代码实践。最终发现,其实但就内存释放上来说,delete和delete[]起到了同样的效果,但是delete[]会告诉编译器释放的是一个数组对象,这样的话,会将该空间中每个元素的析构函数执行一遍,而delete只是会将第一个对象的析构函数执行。因此如果在析构函数中有重要工作完成的话,一定要注意。我们的代码中都是基本数据类型char,因此也没有太大的影响。但是这个毕竟不是好的编程规范,还是要注意。
同时在代码实践的过程中有发现了一个小问题,可以说又可以加深对指针和delete的印象
       char *ptr = new char[len];     
       ptr = "Hello delte!";
       cout << "ptr add: " << &ptr << " " << ptr << endl;
       delete []ptr;
就是上面这段代码,乍一看没什么,但是运行就知道会出现segment fault,经过core dump显示发现是在delete []ptr;处有问题,但是这样已经和前面的new[]对应了啊,会有什么错误。
通过在csdn上查看,发现真正有问题的其实是在ptr = "Hello delte!" 此处,给指针赋了常量字符串的值,也就是说ptr已经指向了常量"Hello delte!"的地址,而不再是new[]出来的那段地址了。因此到delete的时候,编译器会去试图释放"Hello delte!"的地址空间,因此会出现段错误。这一点上更是说明了指针就只是一个表示地址的变量,它的应用重点在于它指向了什么,在初始化赋值后,如果再次给指针变量赋值(不是给指针指向的内容赋值)的时候一定要注意对后续工作的影响。
OK,这点东西写一下还是有助于总结提高嘛,也希望有同学用得着。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值