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

delete和delete[ ]的区别

王叶五
2023-12-01

delete一共干两件事:

1)释放内存

2)执行析构函数

就释放内存来说,编译器是根据你这个指针的地址来知道这块内存的大小的,因为你申请的时候,内存管理器记录了这个地址开始的申请的内存的大小。 所以不管是啥,内置类型(int),自定义类型还是一个xx数组,delete和delete[ ]都释放了内存(把内存标记为未使用)。

但是对第二件事——执行析构函数而言,两者是不同的,delete只会执行一次析构函数,而delete[ ]会找到数组维度n,从数组尾到数组头依次执行析构函数。所以对于那些trivial 析构而言的数组(包括但不限于 int * a =new int[10]),delete和delete [ ] 没有区别,但是对于那些有用的析构,(类使用了某些需要释放的资源) 就不一样了。

比如下面这个

   class A
   {
   private:
      char *m_cBuffer;
      int m_nLen;
   public:
      A(){ m_cBuffer = new char[m_nLen]; }
      ~A() { delete [] m_cBuffer; }
   };
   A *a = new A[10];
   delete a;         //仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数 剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
   delete [] a;      //调用使用类对象的析构函数释放用户自己分配内存空间并且   释放了a指针指向的全部内存空间

 类似资料: