c++下new与delete基础用法

delete 释放new分配的单个对象指针指向的内存

delete[] 释放new分配的对象数组指针指向的内存

那么,按照教科书的理解,我们看下下面的代码:

int *a = new int[10];
delete a;        //方式1
delete [] a;     //方式2

肯定会有很多人说方式1肯定存在内存泄漏,是这样吗?

  1. 针对简单类型 使用new分配后的不管是数组还是非数组形式内存空间用两种方式均可 如:
int *a = new int[10];
 delete a;
 delete [] a;

此种情况中的释放效果相同 原因在于分配简单类型内存时,内存大小已经确定,系统可以记忆并且进行管理,在析构时,系统并不会调用析构函数,

它直接通过指针可以获取实际分配的内存空间,哪怕是一个数组内存空间(在分配过程中 系统会记录分配内存的大小等信息,此信息保存在结构体_CrtMemBlockHeader中,

具体情况可参看VC安装目录下CRT\SRC\DBGDEL.cp2. 针对类Class,两种方式体现出具体差异 当你通过下列方式分配一个类对象数组:

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指针指向的全部内存空间 并且调用使用类对象的析构函数释放用户自己分配内存空间

在vc 中对于简单数据类型int,char等的数组使用delete还是delete[]是完全一样的,不过对于类的实例的数组来说就必须使用delete[],否则可能会引起该类的析沟函数不会被正确调用。

以上内容引自:http://blog.163.com/tsing_best/blog/static/1111530220121302856721/

总结:在不明确指针指向的是否是数组还是单个变量时,用delete[] p;来删除指针是最好的办法。不会引起上面说的间接内存泄露。
原文链接: https://www.cnblogs.com/dongzhuangdian/p/5084830.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/226542

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午1:15
下一篇 2023年2月13日 下午1:16

相关推荐