当前位置: 首页 > 工具软件 > delete > 使用案例 >

delete & delete [ ]

戚奇略
2023-12-01

我的理解是这样的,无论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 )

 类似资料: