char *p = new char[256]; delete p; / delete[] p; 哪个对 为什么

原帖地址: http://topic.csdn.net/u/20071027/12/a31bf228-7b4f-40b2-be41-e3b859f643d4.html

char *p = new char[256];
delete p;
delete[] p;

哪个对 为什么?
----------------------------
delete[] p; 标准做法,通常说,避免内存泄露


必须要有‘[]’符号用以告诉编译器,指针(此处当然是你的p)所指向的是数组,因此在释放pc所指向的内存区块时必须要查询和使用该数组的维度信息,这样才能完全释放p所指的数组占用的内存资源。C++编译器出于效率上的考虑,仅在有‘[]’时,才会查询数组的维度信息。否则,编译器将认为p指向的是单个内存单元,因而delete掉p所指向的单个内存单元造成内存资源泄漏。至于有些朋友有意对数组的delete操作不用‘[]’而没有觉得程序的运行有异常,但我要告诉你们:"内存资源确时已经发生了泄漏!!!只是你的程序规模较小,且运行在一个碰巧相对安全的内存空间,以至你没有发现异常现象而以!"
请参考《C++ Common Knowledge》-条款36-page93。

另外,还可从另一角度说明'delete[]p'与'delete p'存在区别的重要性:

我想大家一定知道,很多C++大师在大谈著名的auto_ptr <typename T>好处的时候,总会明确的告誡使用者,不要把它用于数组!
即你不能如下使用auto_ptr:

char* _parray = new char[100];
auto_ptr <char> _parray(_p);//哎呀!......

为什么呢?就正是因为auto_ptr的析构函数中使用"delete _p;"而不是"delete []p;"!这样,在_parray生命终止后将造成内存泄漏!

转载于:https://www.cnblogs.com/wangicter/archive/2011/08/31/4767445.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值