delete & delete [ ]

本文探讨了C++中delete与delete[]的区别,重点分析了二者在处理数组时的行为差异,尤其关注析构函数的调用过程。通过具体示例说明了不当使用可能导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的理解是这样的,无论new还是new[ ],C++的确知道返回的这个指针它指向多大的内存块,否则它就不可能正确地释放掉这块内存了。但是delete需要知道的不仅仅是指针指向多大的内存, 而更重要的是要知道指针指向的数组中有多少个对象,知道了对象数量才能依次一一调用它们的析构函数。那么,下面的代码会产生什么样的结果??

int * pArray = new int[100];

……

delete pArray;           //本来应该是 delete [ ] pArray;

根据上面的解释,我们不难想象,上述代码错误的原因并不是因为它只释放掉第一个元素的空间而没有能完全释放整个pArray所指的内存。 也就是说,在内存释放上不存在问题。问题出在在这里只对第一个元素调用了析构函数,而其他99个元素并没有被妥善地析构掉。呵呵,这才是真正的问题所 在!! 当然对于整数类型来说并不会导致什么问题,但假如在每个对象中都分配了额外的资源,那么不调用对象的析构函数可就会导致严重的后果了……

那使用delete[ ]有什么用?这要从new[ ]说起,在new一个数组时,编译器会悄悄地在内存中保存一个整数用来表示数组中元素的个数。这样在使用delete[ ]时,编译器就会生成读取这个整数的代码,然后逐个调用析构函数。如果使用delete,则编译器只当作指针所指的是单个对象。再说了,new单个对象 时,编译器也不会悄悄记录数组中元素的个数。呵呵,从这也可以感觉出C++的设计风格和宗旨,决不多费一点手脚,单个对象我就不记录长度,只有是数组时我才记录!:-)

下面为在使用delete或者delete []的时候,不同的构造和析构的例子

#include ;
using namespace std;

class T {

public:

  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor" << endl; }
};

int main()
{
  const int NUM1 = 3;
  const int NUM2 = 4;

  int* p1 = new int[NUM1];
  cout << hex << p1 << endl;
  //  delete[] p1;
  delete  p1;

  T* p2 = new T[NUM2];
  cout <<< p2 << endl;
  delete[] p2;

  getchar();
}

对于int* p1 = new int[NUM1];  使用delete或者delete []都能够达到释放内存空间的效果;对于T* p2 = new T[NUM2];使用delete ,不能够达到释放内存的目的(只调用了一次析构函数)。

 

参考文章:

C++为什么不用delete代替delete[]?

(http://hi.baidu.com/nkhzj/blog/item/3e752b2d3c5c2037349bf7c2.html )

求问delete和delete[] 的区别??

(http://www.chinaunix.net/jh/23/311058.html )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值