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[] 对应使用。

时间: 2024-10-10 06:31:07

delete与delete[]的相关文章

delete与delete [] 真正区别

我们通常从教科书上看到这样的说明: delete 释放new分配的单个对象指针指向的内存 delete[] 释放new分配的对象数组指针指向的内存 那么,按照教科书的理解,我们看下下面的代码: int *a = new int[10]; delete a;        //方式1 delete [] a;     //方式2 肯定会有很多人说方式1肯定存在内存泄漏,是这样吗? 1. 针对简单类型 使用new分配后的不管是数组还是非数组形式内存空间用两种方式均可 如: int *a = new

delete 与 delete []

/* Module: delete与delete[]的区别.cpp Notices: Copyright (c) 2017 Landy Tan */ #include <iostream> using namespace std; //////////////////////////////////////////////////////////////// class CT { public: inline CT(){ cout << "CT()" <&

delete和delete[]的区别(转载)

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. #include <iostream>; using namespa

C++:delete和delete[]释放内存的区别

C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[].  关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. 复制代码 代码如下: #include <iostream>; using namespace std; class T { public: T() { cout << &qu

C++笔试 delete与delete[]区别

转自:http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[] 基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的:但是对于类对象数组,只能用 delete[].对于 new 的单个对象,只能用 delete 不能用 delete[

C++中delete和delete[]的区别

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[].关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. 1 #include <iostream>; 2 using name

【转】 C++中delete和delete[]的区别

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间. 请看下面的程序. #include <iostream>; using namespa

C++ delete 和 delete []

简单结论: new delete new [] delete [] 文章 : 对 delete [] 的声明 void operator delete[] (void* ptr) throw (); void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) throw(); void operator delete[] (void* ptr, void* voidptr2) throw(); 对new 的

关于delete和delete[]

C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间:(2) 为自定义类型分配和回收空间.基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的:但是对于类对象数组,只能用 delete[].   所以一个简单的使用原则就是:new 和 del

C++中delete和delete[]的区别(转)

原文链接:http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html 一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]. 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据