我们通常从教科书上看到这样的说明:
delete 释放new分配的单个对象指针指向的内存
delete[] 释放new分配的对象数组指针指向的内存
那么,按照教科书的理解,我们看下下面的代码:

int *a = new int[10];
delete a;        //方式1
delete [] a;     //方式2

肯定会有很多人说方式1肯定存在内存泄漏,是这样吗?

下面给出总结性说明:

针对简单类型

使用new分配后的不管是数组还是非数组形式内存空间用两种方式均可
如:

int *a = new int[10];
delete a;
delete [] a;

此种情况中的释放效果相同,原因在于:分配简单类型内存时,内存大小已经确定,系统可以记忆并且进行管理,在析构时,系统并不会调用析构函数,它直接通过指针可以获取实际分配的内存空间,哪怕是一个数组内存空间
(在分配过程中 系统会记录分配内存的大小等信息,此信息保存在结构体_CrtMemBlockHeader中具体情况可参看VC安装目录CRT\SRC\DBGDEL.cpp)

针对类Class

两种方式体现出具体差异,当你通过下列方式分配一个类对象数组:

class A
{private:char *m_cBuffer;int m_nLen;
public:A(){ m_cBuffer = new char[m_nLen]; }~A() { delete [] m_cBuffer; }
};A *a = new A[10];

delete a;
仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数 剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏

delete [] a;
调用使用类对象的析构函数释放用户自己分配内存空间并且 释放了a指针指向的全部内存空间

总结

对于像int/char/long/int*/struct等简单数据类型、由于其为基本数据类型没有析构函数,所以使用delete与delete []相同,两者都会释放申请的内存空间,不会有内存泄漏。

当new申请的是C++对象数组时,delete和delete[]差别就很大了,delete只会析构一个对象,而delete[]可以逐一调用数组中的析构函数。

delete ptr 代表用来释放内存,且只用来释放ptr指向的内存。
delete[] rg 用来释放rg指向的内存,还逐一调用数组中每个对象的destructor

建议

为了养成良好的编程习惯,new 和 delete 配套,new[] 和delete[]配套使用。


作者:cbnotes
来源:CSDN
原文:https://blog.csdn.net/cbnotes/article/details/38900799
版权声明:本文为博主原创文章,转载请附上博文链接!

delete 和 delete[]真正区别相关推荐

  1. SQL语法中drop,delete与truncate的区别

    SQL语法中drop,delete与truncate的区别 delete是DML语句,可以选择删除部分数据,也可以选择删除全部数据:删除的数据可以回滚:不会释放空间 drop是DDL语句,删除表结构和 ...

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

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

  3. 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的区别,sql文件导入

     1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert update delete select DDL语言 (Date ...

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

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

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

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

  6. 动态内存管理:malloc和free以及new和delete的联系与区别

    动态内存管理:malloc和free以及new和delete的联系与区别 文章目录 动态内存管理:malloc和free以及new和delete的联系与区别 一. C/C++中程序内存区域划分: 二. ...

  7. delete和delete[]的区别

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

  8. oracle中drop、delete和truncate的区别

    oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...

  9. delete与delete[]的区别

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

  10. 解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别

    转载自  解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别 标准Http协议支持六种请求方法,即: 1.GET 2.POST 3.PUT 4.Delete 5. ...

最新文章

  1. this.$router.push、replace、go的区别
  2. java 命令读取参数_如何读取/处理命令行参数?
  3. Java提高篇 —— Java三大特性之继承
  4. linux下shell编程课程设计,Linux下shell编程实例
  5. Android录制音频的三种方式
  6. mylyn提交到JIRA的日期格式错误
  7. 搭建 WPF 上的 UI 自动化测试框架
  8. EntLib 4.1 第2.5章 DAAB+Unity (数据访问程序块)
  9. 重磅!2020 年算法工程师技术路线图
  10. [Objective-C]ARC中NSString *与CFStringRef的相互转换
  11. 低代码平台对程序员产生的内卷,零代码、低代码系列之一「对于零代、低代码平台的思考」
  12. python caffe框架_Caffe(卷积神经网络框架)配置-Windows篇
  13. Mysql启动选项和配置文件
  14. 4G的想象:移动视频行业将迎来大爆发
  15. vim 插入模式小技巧
  16. 【对讲机的那点事】带你玩转宝锋UV6R对讲机(三)
  17. hass智能 小米扫地机器人_搭建智能家居第三篇:小米系列接入homeassistant的教程分享...
  18. spring boot设置session超时时长(自定义spring boot session超时时长)
  19. LinuxDNS协议一、基础知识
  20. Surfer13如何实现自动白化

热门文章

  1. Linux网络通信------accept函数
  2. Mac- .bash_profile解密
  3. 最新iApp影视App开源源码+附全网解析API
  4. 使用logback时出现Could NOT find resource [logback-test.xml]和Could NOT find resource [logback.groovy]的解决方式
  5. http的无状态无连接到底是什么含义
  6. 【5G流量可视化方案】基于最新的P4可编程芯片的下一代网络汇聚分流设备
  7. 必备知识:三维测量-思维导图
  8. 一起学 mybatis 基础教程
  9. 为何亚马逊的员工说,“亚马逊公司该解体了”,到底发生了什么?
  10. 《食品真相大揭秘》和《中国食品安全现状调查》