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;
}

在这个例子中,先看看结果:

  1. 若是用detele[] p;来释放new申请的这段内存,可以成功释放:

    技术分享

  2. 而利用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 中的参数

scalajs-react:Ajax GET 与 DELETE 的意外差异

为啥这个代码片段说包含错误?

C++ new/delete与 malloc/free

delete 与 delete []

new 与 delete 操作符