在c++中,在堆上分配内存使用的new函数,它动态分配内存,主要有三种形式:
1.分配一个空间未初始化 int* p=new int;
2.分配一个空间初始化 int* p=new int(初始值)
3.分配一段连续空间 int* p=new int[内存数]
在堆上分配内存使用之后还要手动释放,不然就会发生内存泄露。在c++中对堆上分配的内存释放有两种形式:
delete和delete [],如何选择使用这两个释放的方式?选错了会怎样?
拿一个例子来说明:
#include <iostream> using namespace std; class A { public: A() { cout<<"A"<<endl; } ~A() { cout<<"~A"<<endl; } private: }; int main(int argc, char const *argv[]) { A* p=new A[3]; delete[] p; // delete p; return 0; }
在这个例子中,先看看结果:
- 若是用detele[] p;来释放new申请的这段内存,可以成功释放:
- 而利用delete p来释放,会出现错误
而且观察出错点可以发现:delete p 在回收空间的过程中,只有 p[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,因此出现了问题。
经过查阅资料和试验,对于delete和delete[]的区别以及何时使用做一个总结:
如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。new 和 delete、new[] 和 delete[] 对应使用。
时间: 2024-10-10 06:31:07