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

 更新时间:2013年02月26日 16:56:12   作者:  
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。希望本文可以对你有所帮助

    C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。  关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

请看下面的程序。

复制代码 代码如下:

#include <iostream>;
using namespace std;

class T {
public:
  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor" << endl; }
};

int main()
{
  const int NUM = 3;

  T* p1 = new T[NUM];
  cout << hex << p1 << endl;
  //  delete[] p1;
  delete p1;

  T* p2 = new T[NUM];
  cout << p2 << endl;
  delete[] p2;
}


大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。

    从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。      基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。      所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。

 

  我的理解,当用delete来释放用new int[]申请的内存空间时,由于其为基本数据类型没有析构函数,所以使用delete与delete []相同,两者都会释放申请的内存空间,若是自定义的数据类型,有析构函数时,用new []申请的空间,必须要用delete []来释放,因为要delete []时会逐一调用对象数组的析构函数,然后释放空间,如果用delete,则只会调用第一个对象的析构函数,后面对象的析构函数没有被调用,那么其空间是否释放了呢??

相关文章

  • C语言函数调用基础应用详解

    C语言函数调用基础应用详解

    函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。这篇文章主要介绍了c语言是如何处理函数调用的?需要的朋友可以参考下
    2023-02-02
  • Qt创建SQlite数据库的示例代码

    Qt创建SQlite数据库的示例代码

    本文主要介绍了Qt创建SQlite数据库的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C语言 详解如何删除有序数组中的重复项

    C语言 详解如何删除有序数组中的重复项

    数组不擅长插入(添加)和删除元素。数组的优点在于它是连续的,所以查找数据速度很快。但这也是它的一个缺点。正因为它是连续的,所以当插入一个元素时,插入点后所有的元素全部都要向后移;而删除一个元素时,删除点后所有的元素全部都要向前移
    2022-03-03
  • C语言猜凶手的代码实现

    C语言猜凶手的代码实现

    本文主要介绍了C语言猜凶手的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 详解C语言中的Static关键字

    详解C语言中的Static关键字

    这篇文章主要为大家介绍了C语言中Static关键字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • c++中cin实现输入字符串方式

    c++中cin实现输入字符串方式

    这篇文章主要介绍了c++中cin实现输入字符串方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Matlab实现绘制雷达图(蜘蛛图)

    Matlab实现绘制雷达图(蜘蛛图)

    这篇文章主要为大家详细介绍了如何利用Matlab实现雷达图(蜘蛛图)的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-09-09
  • C++小知识:不要去做编译器的工作

    C++小知识:不要去做编译器的工作

    今天小编就为大家分享一篇关于C++小知识:不要去做编译器的工作,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Opencv绘制最小外接矩形、最小外接圆

    Opencv绘制最小外接矩形、最小外接圆

    这篇文章主要为大家详细介绍了Opencv绘制最小外接矩形、最小外接圆的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 输出1000以内的素数的算法(实例代码)

    输出1000以内的素数的算法(实例代码)

    本篇文章是对输出1000以内的素数的算法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论