delete与delete[]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delete与delete[]相关的知识,希望对你有一定的参考价值。
在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[] 对应使用。
本文出自 “君峰俊宇” 博客,请务必保留此出处http://10274409.blog.51cto.com/10264409/1747048
以上是关于delete与delete[]的主要内容,如果未能解决你的问题,请参考以下文章
无法访问 express js router.delete 中的参数