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

以前看书的时候,书上说使用new申请的内存,释放时用delete,使用new [ ]申请的内存释放时要用delete [ ]才行,这两个一定要记住,申请时用了方括号,则释放时也要加上方括号,否则就会出错。但是并没有解释为什么这样,会出什么错。今天正好看到这个,记录下。

关于动态申请的内存,分两种情况:基本数据类型的分配和自定义数据类型的分配。两者不同。

1、基本数据类型

对于基本数据类型,假如有如下代码

int *a = new int[10];

...

delete a;    // 方式1

delete [ ] a;    //方式2

肯定会不少人认为方式1存在内存泄露,然而事实上是不会!针对简单的基本数据类型,方式1和方式2均可正常工作,因为:基本的数据类型对象没有析构函数,并且new 在分配内存时会记录分配的空间大小,则delete时能正确释放内存,无需调用析构函数释放其余指针。因此两种方式均可。

2、自定义数据类型

这里一般指类,假设通过new申请了一个对象数组,注意是对象数组,返回一个指针,对于此对象数组的内存释放,需要做两件事情:一是释放最初申请的那部分空间,二是调用析构函数完成清理工作。对于内存空间的清理,由于申请时记录了其大小,因此无论使用delete还是delete[ ]都能将这片空间完整释放,而问题就出在析构函数的调用上,当使用delete时,仅仅调用了对象数组中第一个对象的析构函数,而使用delete [ ]的话,将会逐个调用析构函数。

有如下代码:

#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; //输出P1的地址

// delete[] p1;

delete p1;

cout << endl;

T* p2 = new T[NUM];

cout << p2 << endl; //输出P2的地址

delete[] p2;

return 0;

}

输出结果为

可以看到,不加[ ]符号时确实只调用了一次析构函数。

问题来了,既然不加方括号也能完整释放内存,那不就没多调用几个析构函数吗,怎么了?想想看,万一析构函数需要释放系统资源呢?比如文件?线程?端口?这些东西使用了而不释放将会造成严重的后果。因此,虽然内存完整的释放了,但是有时候不调用析构函数则会造成潜在的危险。

所以new的时候使用了[ ],那么delete的时候还是使用[ ]吧!

C++ delete和delete[ ]的使用相关推荐

  1. 关于delete和delete[]

    [精彩] 求问delete和delete[] 的区别?? http://www.chinaunix.net/jh/23/311058.html C++告诉我们在回收用 new 分配的单个对象的内存空间 ...

  2. C++ delete 和 delete []的区别

    转载自https://blog.csdn.net/cbNotes/article/details/38900799 1.我们通常从教科书上看到这样的说明: delete 释放new分配的单个对象指针指 ...

  3. delete与delete[]

    A: C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[] 关于 new[] 和 delete[],其 ...

  4. delete 和 delete [] 的真正区别

    c++中对new申请的内存的释放方式有delete和delete[]两种方式,到底这两者有什么区别呢? 1.我们通常从教科书上看到这样的说明: delete 释放new分配的单个对象指针指向的内存 d ...

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

    一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...

  6. delete和delete[]的区别

    一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...

  7. delete与delete[]的区别

    一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...

  8. c++中的delete和delete[]

    c++中的delete和delete[] 昨天写了一篇关于delete和delete[]的文章,有位仁兄指出我的结论是错误的,那样的结果只会在特定的编译器程序.为了不会误导大家,文章意见删除.回家后仔 ...

  9. 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader

    为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader ------jiese1990 温馨提示: 该文所 ...

  10. char *p = new char[256]; delete p; / delete[] p; 哪个对 为什么

    原帖地址: http://topic.csdn.net/u/20071027/12/a31bf228-7b4f-40b2-be41-e3b859f643d4.html char *p = new ch ...

最新文章

  1. ALEIDoc EDI(2)--一般流程
  2. 【POJ - 2253】Frogger(floyd,或 部分瓶颈生成树的最大边)
  3. IIS负载均衡(转)
  4. 自制基于HMM的python中文分词器
  5. 用css3实现的Android Logo
  6. C语言和设计模式(解释器模式)
  7. ~~试除法判定质数 (附模板题)
  8. 【深度学习】深度学习入门——BP网络反向传播
  9. php app()路由,谷歌云应用引擎app.yaml php72与路由问题
  10. vue pc移动两个html,vue一套代码适应移动端,pc端
  11. 2022跨年烟花代码(五)HTML5全屏烟花特效
  12. OpenCV每日函数 图像过滤模块 (14) medianBlur中值滤波函数
  13. Relatively Prime Graph(贪心+注意数据范围)
  14. c#写服务程序怎么判断文件夹内子文件夹里文件的变化
  15. 代码质量有哪些评判标准?
  16. 苹果怎么换行打字_好玩的微信空白朋友圈怎么发?教程来了!
  17. 1小时学会HTML5基础
  18. 微信Mac 3.0.0内测版上线!终于可以用电脑刷朋友圈了!!
  19. 乐鑫M5GO自制睡眠小助手!新手。。。轻打脸
  20. 【发车优化】基于遗传算法的公交车调度排班优化的研究与实现附Matlab代码

热门文章

  1. 单片机LED指示灯限流电阻一般470Ω以上尽量大于1KΩ的原因分析
  2. 流媒体云时代的声与色,融云铺就的桥与路
  3. BlueCam Cloud Technical Support
  4. UnityAPI.WheelCollider轮碰撞器(Yanlz+API+WheelCollider+motorTorque+brakeTorque+steerAngle+GetWorldPose+)
  5. html5我的心灵小屋,我的小屋
  6. CF1638E. Colorful Operations 珂朵莉树+差分树状数组
  7. 【C语言】作业:统计字符串中元音字母a,e,i,o,u的个数并输出
  8. spark on k8s: master pod kube-proxy-mkbp7 Evicte -- The node was low on resource: ephemeral-storag
  9. jsoncpp判断key是否存在以及类型
  10. Kubernetes服务搭建[配置-部署](Kubeadm)