原文地址
本文是上面那篇总结了,再加上了一点点自己的体会
(i)malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员);
(ii)malloc/free是C/C++标准库的函数,new/delete是C++操作符;
(iii)new表达式并不直接开辟内存出来,而是通过调用operator new来获得的内存,而operator new获得的内存实质上还是用malloc开辟出来的。它们只是malloc和free的一层封装;
(iv)delete[]实际做了这样几件事情:依次调用指针指向对象数组中每个对象的析构函数;调用operator delete,它将再调用operator delete;底层用free执行operator delete表达式,依次释放内存;
【注】:这就是为什么在析构函数中再次调用delete[]时候会报错了。因为释放多了内存
(v)AA* pA = new AA[10];中,new最后将开辟好内存用指针p返回,pA接收它。p 和pA 会差上4字节的原因:
编译器用相差的这4个字节用来保存对象个数,然后返回该处地址。
【注】:在delete[] 的时候,不用传给它对象个数的原因。而且new type[] ,只有type显示定义析构函数时,编译器才会多开4字节来保存对象个数。所以像new int、char这样的内置类型编译器不会多开这4字节,编译器自行优化。
(vi)delete, delete[] 之间不能误用,不然会导致内存泄漏。
本来该用delete[],用错:
New AA []本来多开辟了4个字节空间,但delete认为不存在,会直接从该处释放,导致这多余的四个空间未释放。
本来该用delete,用错:
这次本来没开辟4字节,造成非法访问。