delete和delete[]的区别

2023-05-16

  1. 对于简单类型。

简单类型像 int /char/int */long/struct等。由于对象是没有析构函数的。所以delete和delete[]是一样的。

int * arr = new int[10];
delete arr;
delete[] arr;//两种方式均可

因为分配简单类型内存时,内存大小已经确定,系统可以记住且进行管理,在释放(析构)的时候由于简单类型new出来的对象没有析构函数。系统也不会调用析构函数,而是直接通过指针就可以获取实际分配的内存空间,哪怕是一个数组内存空间。(在分配过程中系统会记录分配内存的大小等信息)

  1. 对于类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];

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

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

所以总结下就是,如果ptr代表一个用new申请的内存返回的内存空间地址,即所谓的指针,那么:

  • delete ptr -- 代表用来释放内存,且只用来释放ptr指向的内存。

  • delete[] rg -- 用来释放rg指向的内存,!!还逐一调用数组中每个对象的 destructor!!

我们来看一个例子:

#include <iostream>
using namespace std;

class Babe
{
public:
    Babe()
    {
        cout << \"Create a Babe to talk with me\" << endl;
    }

    ~Babe()
    {
        cout << \"Babe don\'t Go away,listen to me\" << endl;
    }
};

int main()
{
    Babe* pbabe = new Babe[3];
    delete pbabe;
    pbabe = new Babe[3];
    delete[] pbabe;
    return 0;
}

结果是:

Create a babe to talk with me
Create a babe to talk with me
Create a babe to talk with me
Babe don\'t go away,listen to me
Create a babe to talk with me
Create a babe to talk with me
Create a babe to talk with me
Babe don\'t go away,listen to me
Babe don\'t go away,listen to me
Babe don\'t go away,listen to me

大家都看到了,只使用 delete 的时候只出现一个 Babe don’t go away,listen to me,而使用 delete[] 的时候出现 3 个 Babe don’t go away,listen to me。不过不管使用 delete 还是 delete[] 那三个对象的在内存中都被删除,既存储位置都标记为可写,但是使用 delete 的时候只调用了 pbabe[0] 的析构函数,而使用了 delete[] 则调用了 3 个 Babe 对象的析构函数。

你一定会问,反正不管怎样都是把存储空间释放了,有什么区别???。

答:关键在于调用析构函数上。此程序的类没有使用操作系统的系统资源(比如:Socket、File、Thread等),所以不会造成明显恶果。如果你的类使用了操作系统资源,单纯把类的对象从内存中删除是不妥当的,因为没有调用对象的析构函数会导致系统资源不被释放,如果是 Socket 则会造成 Socket 资源不被释放,最明显的就是端口号不被释放,系统最大的端口号是 65535 (216 _ 1,因为还有0),如果端口号被占用了,你就不能上网了,呵呵。如果 File 资源不被释放,你就永远不能修改这个文件,甚至不能读这个文件(除非注销或重启系统)。如果线程不被释放,这它总在后台运行,浪费内存和 CPU 资源。这些资源的释放必须依靠这些类的析构函数。所以,在用这些类生成对象数组的时候,用 delete[] 来释放它们才是王道。而用 delete 来释放也许不会出问题(也可能有的编译器直接报错,或者引发中端),也许后果很严重,具体要看类的代码了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

delete和delete[]的区别 的相关文章

  • 使用 Ajax 发送的PUT、DELETE请求

    一 方式一 xff1a 将 POST 请求转化为相应的 PUT 和 DELETE 请求 1 在 Web xml 中添加如下配置 xff1a 用于将 POST 请求转化为相应的 PUT 和 DELETE 请求 lt filter gt lt
  • C++(1) 指针 new 和delete

    1 概念 new typeName pointer name 61 new typeName delete delete pointer name 注意 xff1a 1 new之后要判断 xff0c 指针是否为NULL xff0c 内存被耗
  • 使用Object.key和delete来将对象中值为空的属性删除。

    有些时候 xff0c 我们在接口传值时 xff0c 不需要把值为空的属性传过去 xff0c 即可使用该方法来快速的删除属性 span class token comment 深拷贝对象 xff0c 避免影响页面显示 span span cl
  • 数据湖Data Lakehouse支持行级更改的策略:COW、MOR、Delete+Insert

    COW 写时复制 MOR 读时合并 Delete Insert 保证同一个主键下仅存在一条记录 将更新操作转换为Delete操作和Insert操作 COW和MOR的对比如下图 而Delete Insert在StarRocks主键模型中用到
  • js delete删除key

    var a 61 a a 61 1 a b 61 2 delete a 34 a 34 console log a b 2 delete a b console log a js 的delete可以根据key删除对象中的元素
  • ceph delete pool

    参考 xff1a Pools Ceph Documentation 前言 xff1a 网上的写的乱七八糟不是你抄我就是我抄你 写的完全瞎扯 简直看不下去 官网截图 xff1a 准备 1 查看pool名称 ceph osd lspools 创
  • HTTP 请求方法 GET/POST/PUT/DELETE

    Web HTTP基础知识 HTTP请求是什么 xff1f HTTP超文本传输协议 xff0c 是确保服务器 xff08 Server xff09 和客户端 xff08 Client xff09 之间的正确通信 一个请求和响应的过程 xff1
  • 多表可更新视图的实现

    多表关联后的数据能保证主键唯一的视图是可直接做更新 不需要用触发器实现 多表视图的定义 当视图的数据源只有一张数据表 则该视图为单表视图 当视图的数据源是多张数据表 则该视图为多表视图 可更新视图的定义 在绝大多数人的概念中 视图是只读的
  • nafxcwd.lib和afxmem.obj的冲突

    gt Build started Project ReplaceOther Configuration Debug Win32 1 gt Linking 1 gt ImageTagInfo obj warning LNK4075 ignor
  • do...while(0)的妙用

    在C 中 有三种类型的循环语句 for while 和do while 但是在一般应用中作循环时 我们可能用for和while要多一些 do while相对不受重视 但是 最近在读我们项目的代码时 却发现了do while的一些十分聪明的用
  • 验证实例的有效性与类型的判断

    我们常常会用到指针变量 指针只有赋值以相应的实例才有意义 怎么判断指针引用实例的有效性是我们经常面对的一个问题 我现在 只知道两种方法 列举如下 1 ASSERT VALID pMyObject ASSERT VALID 要判断的类必须是C
  • js 打开窗体的操作类

    create Author 让 create datetime 2011 04 22 function description 打开一个新窗口的操作类 var winOperater defaultOpenOptions window op
  • 查询及删除重复记录

    查询及删除重复记录的方法大全 1 查找表中多余的重复记录 重复记录是根据单个字段 peopleId 来判断select from peoplewhere peopleId in select peopleId from people gro
  • VC 根据域名获取IP

    include Winsock2 h pragma comment lib Ws2 32 lib 注意字符串需以 0结尾 例如 lpzSeverName www baidu com 0 bool WINAPI Domain2IP char
  • C++中前置声明的应用与陷阱

    前置声明的使用 有一定C 开发经验的朋友可能会遇到这样的场景 两个类A与B是强耦合关系 类A要引用B的对象 类B也要引用类A的对象 好的 不难 我的第一直觉让我写出这样的代码 A h include B h class A B b publ
  • C++设计日志:读写定界符文件

    C 设计日志 读写定界符文件 荣耀 2003 我将撰写的 C 设计实践 系列文章 会讲到一些数据处理系统设计方法 我并不希望文章局限于特定数据库产品 我也不喜欢空对空地讲述太多抽象道理 我必须编写一些模拟数据库操作的代码 用于读写定界符文件
  • postgresql 删除单个表的数据

    2种方法都只删数据 保留表结构 方法一 适用数据量较小的情况 delete from tablename 方法二 适合删除大量数据 速度快 TRUNCATE TABLE tablename 若该表有外键 要用级联方式删所有关联的数据 TRU
  • SQL删除重复数据只保留一条

    用SQL语句 删除掉重复项只保留一条 在几千条记录里 存在着些相同的记录 如何能用SQL语句 删除掉重复的呢1 查找表中多余的重复记录 重复记录是根据单个字段 peopleId 来判断 select from people where pe
  • 关于C++对象模型(下)

    下篇主要讨论调用成员函数 访问成员变量的开销 及其特殊成员函数 数组 异常处理的讨论 这篇文章中出现的对象定义都出现在上篇中 全文在这里下载 文章内容转自 http tb blog csdn net TrackBack aspx PostI
  • 如何在 Linux 中删除超过 30 天的文件

    定期从服务器中清除旧的未使用文件是最佳实践 例如 如果我们每天 每小时在服务器上运行文件或数据库备份 那么服务器上将会产生很多垃圾 所以要定期清洁 为此 您可以从备份目录中找到旧文件并清理它们 本文向您介绍如何查找和删除超过 30 天的文件

随机推荐

  • Servlet 三角形判断以及面积计算

    题目描述 xff1a 用html和servlet编程实现输入三角形的三个边长并计算和输出三角形的面积 要求如下 1 编写一个inputhtml页面 xff0c 页面中包括输入三个边长和和提交按钮的表单 2 编写一个文件名为TriangleS
  • Warning: Stopping docker.service, but it can still be activated by: docker.socket解决方案

    文章目录 问题描述 xff1a 1 解决方案一2 解决方案二 xff1a 问题描述 xff1a 当容器开启自动启动时 xff0c 我们想要关闭docker的时候发现会出现 xff1a Warning Stopping docker serv
  • 虚拟机Ubuntu安装vs code操作步骤

    1 在浏览器上搜索 xff1a https code visualstudio com Download 2 选择 deb 按钮下载 3 下载完成后打开文件 4 右键安装包 xff0c 选择打开方式 xff1a 软件安装 点击安装 xff0
  • ping不通Linux服务器的原因?

    ping命令是各种操作系统中经常会用到的一个网络命令 xff0c 也是一个通信协议 xff0c 主要用来测试目标主机的连通性 xff0c 检查网络是否连通 问题 xff1a 那ping不通Linux系统服务器是什么原因呢 xff1f 总结
  • RHCE第二天

    作业 xff1a 1 配置chrony时间服务器 xff0c 确保客户端主机能和服务主机同步时间 两台机器 第一台机器作为时间服务器从ntp aliyun com同步时间 xff08 注意包含意外情况 xff0c 如果不能上外网 xff0c
  • ubuntu20.04版本 安装ros1与px4、mavros、QGroundControl

    基于个人安装时的操作以及所浏览的链接 xff0c 仅供参考 文章目录 前言一 pandas是什么 xff1f 二 使用步骤 1 引入库2 读入数据总结 前言 使用ubuntu下载ros px4似乎是一件十分繁琐以及困难的事情 xff0c 但
  • 无用的知识--定时提醒(go语言小工具)

    遇到喜欢的事情总是欲罢不能 xff0c 一不小心就酿成了打错 xff0c 比如说在B站上学习 xff08 卷 xff09 过度 xff0c 错过了重要的事情 不用担心 xff0c 今天分享go语言写一个windows系统中定时提醒小工具 p
  • 重装Office后打开Powerpoint和excel提示找不到VCRUNTIME140_1.dll的解决办法(亲测成功,简单有效)

    1 下载VCRUNTIME140 1 dll xff08 可搜索下载途径 xff09 2 将其复制到OFFICE安装目录 xff0c 如下 C Program Files Microsoft Office16 3 再次打开即成功 xff01
  • ERROR:zygote_host_。。。。。Running as root without --no-sandbox is not supported.

    安装好google后 xff0c 在命令行输入google chrome后出现 xff0c ERROR zygote host impl linux cc 89 Running as root without no sandbox is n
  • 【IOT开发】蓝牙模块与PC连接通讯实验

    这是在一个项目中 xff0c 需要开发 windows APP xff0c 通过蓝牙与下位机通讯 之前接触过的一些蓝牙项目 xff0c 大多是 模块与模块 通讯 xff0c 也见过很多模块 手机通讯的教程 xff0c 但PC端直接与蓝牙模块
  • Linux安装JDK详细教程(附图)

    Linux安装JDK详细教程 xff08 图文教程 xff09 这里介绍两种方式 xff1a yum安装方式和手动安装 1 yum安装 1 1 查看JDK版本 xff0c 找到你想要安装的JDK版本 xff0c 这里以 JDK1 8 为例
  • AD布线后批量改线宽

    最近在学习AD画板 xff0c 打算布线结束后再改线宽 xff0c 遇到了一些问题 xff0c 经过网上的资料已经解决 首先 xff0c 右键空白处 xff0c 选择第一个 查找相似对象 然后用十字标选择想要更改的线 在弹出的框中更改 NE
  • 使用springboot启动类报错: 找不到或无法加载主类怎么解决?

    出现问题的原因是 xff1a 在使用springboot启动类时 xff0c 并没有写错代码和注解 xff0c 然后它还是报错找不或无法加载主类 解决此问题的办法 就是 xff0c 重新在项目结构中的Modules吧项目移除再次加载进了即可
  • 【iOS】---pthread,NSThread

    在iOS中多线程开发有四种方式 xff0c 在之前我们浅浅了解了一下GCD xff0c 这期来看看pthread和NSThread pehread pthread简介 pthread 是一套通用的多线程的 API xff0c 可以在Unix
  • 如何关闭windows11 Defender防火墙

    windows Defender是windows系统自带的防火墙 xff0c 但是由于它太过于敏感 xff0c 导致很多软件 xff0c 程序被误杀 一般默认开启时 xff0c Denfender防火墙拦截时会弹出提示 下面教大家如何关闭w
  • C++友元类和友元函数

    特点 xff1a 能访问私有成员 破坏封装性 友元关系不可传递 若B是A的友元 xff0c C是B的友元 xff0c 但C不一定是A的友元 xff0c 要看类中是否有申明 友元关系的单向性 若A是B的友元 xff0c 但B不一定是A的友元
  • windows和Ubuntu(linux操作系统)之间如何进行文件互传

    Windows和Ubuntu下的Linux操作系统之间的文件互传需要用到应用层的FTP协议 xff08 文件传输协议 xff09 xff0c 设置方法如下 xff1a 1 xff1a 打开Ubuntu下的Linux操作系统的FTP服务 打开
  • 有网但浏览器不显示网页如何解决

    如果网络没有问题 xff0c 但是浏览器显示不了网页 xff0c 首先考虑是不是DNS出了问题 xff0c 导致域名解析失败 如何解决呢 xff1f 1 打开控制面板 xff0c 打开所有控制面板 找到网络和共享中心 2 找到Interne
  • pycharm下的vc2没有代码提示(不用改文件)

    我第一次遇到cv2没有代码提示的时候也是一脸懵逼 xff0c 在网上搜索了各种解决办法 包括但不限于修改 init py文件 xff0c 复制文件 xff0c 降低opencv的版本等 xff0c 都没有用 但是最后还是参考网上建议以及自己
  • delete和delete[]的区别

    对于简单类型 简单类型像 int char int long struct等 由于对象是没有析构函数的 所以delete和delete 是一样的 int arr 61 new int 10 delete arr delete arr 两种方