求问delete和delete[] 的区别

深入解析fio Benchmark测试:从源码到实践 本文深入解析fio Benchmark测试工具,从入门指南到源码架构分析,详细介绍了其核心模块、关键数据结构I/O处理机制。通过实战案例展示如何优化存储性能测试,包括内存对齐、多线程调优等技巧,帮助开发者充分利用fio进行精准的存储性能评估。 阅读详情

[精彩] 求问delete和delete[] 的区别??


http://www.chinaunix.net 作者:kingofhacker  发表于:2008-02-19 17:36:04
发表评论】【查看原文】【C/C++讨论区】【关闭

测了一下,好像没有区别,又想不起在什么地方能用到delete[],大家评论一下。

#include <iostream>;
#include "xercesc/dom/DOM.hpp"
int main(){

        char* pc = 0;
        char* pc2;
        int i = 21;
        pc = new char;
        std::cout<<(long)pc<<std::endl;
        delete pc;
        std::cout<<(long)pc<<std::endl;

        pc2 = new char;
        std::cout<<(long)pc2<<std::endl;

        return 0;
}

输出:
[root@ts xml]# ./a.out
134519536
134519536
134519536

地址没有变化,用delete[], delete都一样



 whyglinux 回复于:2004-04-23 12:08:12

C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。

楼主的这个问题提得很好。很多人注意到了这个问题,但是却不清楚为什么要这样做,不这样做行不行。

关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

对于 (1),上面提供的程序已经证明了 delete[] 和 delete 是等同的。但是对于 (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[] 对应使用。


 ukalpa 回复于:2004-04-23 15:12:51

感谢解释,又解决了一个疑问,呵呵:)


 kingofhacker 回复于:2004-04-26 09:38:31

thanks,我应该多试试的


 xhl 回复于:2004-04-26 10:14:18

好贴,收藏


 zhangwei_jef 回复于:2004-04-26 12:27:44

好贴


 gbunix 回复于:2004-04-26 17:54:30

whyglinux ,基础理论很强吗。
刚想回答,被你抢了!! :em09: 迷死你了!!!!!!


 lonemoon 回复于:2004-04-27 09:44:30

经典,顶一下。


 bobar 回复于:2004-05-02 17:50:38

支持一下


 THEBEST 回复于:2004-05-02 18:38:22

我想问一下楼主说地址都一样和这里的delete(delete[])有关系吗?
还有它这里为什么地址会一样呢?不是两个new吗?怎么会new到一起去了呀?


 playmud 回复于:2004-05-06 14:05:52

反对!!!!!!!!
delete 和delete []的不同和是不是自己定义的类型无关,强烈反对,这种贴子进精华,我觉得就是误导!


 THEBEST 回复于:2004-05-07 21:34:22

引用:原帖由 "THEBEST" 发表:
吗?
还有它这里为什么地址会一样呢?不是两个new吗?怎么会new到一起去了呀?

没问题么这个?
还有到底和是否自定义类型有关呢?


 youngbird 回复于:2004-05-08 14:51:50

我试过了,觉得whyglinux 是对的。不知playmud反对有什么理由吗?


 netAnts_1979 回复于:2004-05-08 17:00:12

引用:原帖由 "THEBEST" 发表:
吗?
还有它这里为什么地址会一样呢?不是两个new吗?怎么会new到一起去了呀?




delete 和delete[] 只是告诉编译器这个地址的内容已经被释放了,该地址又是重新可用的了,我们常说的野指针就是delete 和delete[]后的地址,正确的做法是在delete 后把该指针赋为null


 playmud 回复于:2004-05-09 17:43:23

不管是不是自己定义的类型,只要是new []出来的就要delete [].
否则只是释放地址,不是释放内容。


 flw 回复于:2004-05-09 17:54:25

二楼太帅了~~~
说话抑扬顿挫地。


 THEBEST 回复于:2004-05-09 18:31:28

引用:原帖由 "netAnts_1979"]罚返淖龇ㄊ窃赿elete 后把该指针赋为null
 发表:

我的意思是为什么pc2与pc相等。这是巧合?


 shiyigsf 回复于:2004-05-13 17:53:54

同意whyglinux 意见,以下为我的测试代码:
测试环境:win2000 professional, VC6.0
#include<iostream.h>;
void main()
{
          char *p=new char[4];
char *t;
cout<<(long)*p<<(long)(*(p+1))<<endl;
t=p;
cout<<(long)(*(t+1))<<endl;
delete []p; //或者delete p;

cout<<(long)(*(t+1))<<endl;
}
但是结果是一样的,如下:
-51-51
-51
-35
说明在非自定义类型中调用delete[] 和delete是一样的效果。
不知道对不对,请大家指教!


 whyglinux 回复于:2004-05-13 21:57:07

判断分配的内存是否回收,不能从这块内存的值的变化上看出来。你上面的测试说明不了问题。


 luoting 回复于:2004-05-14 12:27:12

我个人觉得,与自定义类型或基本类型应该无关。
不过,得再试验才能定论。


 我不懂C++ 回复于:2004-06-29 11:51:42

引用:原帖由 "playmud"]只是释放地址,不是释放内容。
 发表:

playmud说得对
看这种问题,要从本质出发,不能用一两个编译器的结果来总结。


 greegree 回复于:2008-02-15 17:47:04

我有一个疑问。

在我的程序中如下:

if ( m_CEdit_Send_Cmd.GetLineCount() > 5 )
{
int line_count,last_line_length;
char *last_line;
line_count = m_CEdit_Send_Cmd.GetLineCount();
m_Send_Cmd.Empty();
last_line=new char[64];
last_line_length = m_CEdit_Send_Cmd.GetLine ( line_count-2,last_line,1024 );
last_line[last_line_length]='/0';
m_Send_Cmd.Format ( _T ( "%s/r/n" ),last_line );
delete [] last_line;
}

在这里的delete就会出现错误,但是把delete删掉,程序就运行正常了。为什么呢?难道new和delete不是配对使用的吗?


 leemj_226 回复于:2008-02-19 17:24:03

定一下


 gothicane 回复于:2008-02-19 17:36:04

c++标准要求成对使用,否则后果是未定义的。这里没事并不代表在其他地方也没事,要养成好习惯啊~




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=311058
转载请注明作者名及原文出处
软考 系统架构设计师历年真题集萃(334)—— 2026年5月系统架构设计师真题27 阅读详情

相关推荐

国产上位机软件突围:适配统信UOS/麒麟OS的跨平台开发技术与实践(2026年信创实战指南)

(航天科技集团CTO):“在信创战场上,1ms的延迟意味着1个卫星的控制失效。2026年,C#/.NET MAUI不是选择,而是我们守护卫星的‘生命线’。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 334

delete delete []的真正区别

c++中对new申请的内存的释放方式有deletedelete[两种方式,到底这两者有什么区别呢? 1.我们通常从教科书上看到这样的说明: delete 释放new分配的单个对象指针指向的内存 delete[] 释放new分配的对象数组指针指向的内存 那么,按照教科书的理解,我们看下下面的代码: int *a = new int[10]; delete a;        //方

cbNotes的专栏:不积硅步,无以至千里;不积小流,无以成江海! 6万+

CANoe_从_CAPL_节点调用_Python_脚本的示例_CAPL_测试用例_C_测试用例

<think>我们根据要求生成≤150字的摘要。内容是关于CANoe中从CAPL节点、CAPL测试用例C#测试用例调用Python脚本的示例,使用sysExecCmd、testWaitForSyscall、Execution.WaitForSyscall函数,要求CANoe 20以上。摘要需简洁。</think>本文介绍在CANoe中从CAPL节点、CAPL测试用例及C#测试用例调用Python脚本的方法,通过sysExecCmd、testWaitForSyscallExecution.WaitForS

蚂蚁小兵 317

求问deletedelete[] 的区别??

C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。楼主的这个问题提得很好。很多人注意到了这个问题,但是却不清楚为什么要这样做,不这样做行不行。关于 new[] delete[],其中又分为两种情况:(1) 为基本数据类型分配回收空间;(2) 为自定义类型分配回收空间。

james@BJ的专栏 454

[精彩] 求问deletedelete[] 的区别

<br />C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 <br /><br />楼主的这个问题提得很好。很多人注意到了这个问题,但是却不清楚为什么要这样做,不这样做行不行。 <br /><br />关于 new[]  delete[],其中又分为两种情况:(1) 为基本数据类型分配回收空间;(2) 为自定义类型分配回收空间。 <br /><br />对于 (1),上面提供的程序已经证明了 de

ljq550000的专栏 448

环境不稳、用例乱跳?Playwright自动化避坑大全

一、测试环境不稳定即使你的脚本写得再完美,如果测试环境自身不稳定,也会导致测试失败。常见原因:1. 网络波动:测试机与被测系统之间的网络不稳定。2

2601_96238782的博客 184

AI 中提到的Harness到底是什么东东

Agent-Harness是包裹LLM的工程外壳,含循环、工具、上下文、沙箱、重试等,使裸模型能执行任务;Eval-Harness则用于离线评测。Agent≈LLM+Harness,但此公式忽略提示词影响且不含评测系统,仅为简化表述。

liwenxiang629的博客 200

企业接口自动化中,单例模式如何优雅处理不同租户不同角色的登录

一个类在整个进程中只保留一个实例,后续再创建时返回的还是同一个对象。你可以把它理解成“全局只有一个管家”。在这个项目里,都是这个思路。这意味着:不会重复创建鉴权管理器它内部的缓存状态可以统一共享登录态、配置、环境信息都可以集中管理用单例统一管理鉴权对象,用缓存避免重复登录,用 fixture 注入不同角色租户,用客户端封装不同系统的登录差异。这套设计的核心不是“炫技”,而是为了让企业级接口自动化更稳定、更易维护。这篇文章讲的不是一个简单的登录函数,而是一套适合企业接口自动化的鉴权基础设施。

Tizzy的博客 482

App自动化测试:高级控件定位技巧

在 Selenium WebDriver 中使用 ActionChains 时,可以通过链式调用方法来执行一系列操作,并使用 perform 方法来触发操作的执行。

2601_96229924的博客 174

零基础入门python52:FastAPI current_user鉴权依赖

上一篇练习围绕“OAuth2表单登录与JWT”。参考做法是先运行上一篇的测试,再用一个成功请求一个失败请求验证边界;本篇在同一项目上增加新能力。

a1250467048的博客 396

Stimulsoft Reports.Net 自定义函数实战:财务报表金额中文大写与含税价统一计算

本文用 C# 把「中文大写金额」「含税价」等财务口径封装为 Stimulsoft 报表自定义函数,详解 2026.3 特性标注与全版本 AddFunction 兜底、完整实现代码、表达式调用与单元测试,帮助 .NET 团队统一财务单据口径。

励志做最业余的专业博主,控件产品可以私我~ 361

如何利用 AI Coding 提效?从工具到思维的全面升级

AI Coding 工具仍在以月为单位迭代,今天的选择可能半年后就过时。但那些真正提效的人,靠的不是某个具体工具,而是一套人机协作的思维方式把精力从「写代码」移到「定义问题、拆解任务、验收结果」;把小步迭代、测试驱动、上下文沉淀变成默认工作习惯;把 AI 当成一个需要训练管理的协作者,而不是一个魔法按钮。工具终将趋同,能力分层会在人的层面重新拉开。现在开始转变思维的人,会在这场效率革命里拿到最多的复利。

2601_96493715的博客 373

Codex 启动回复合格后,我会用三类证据验收前端改动

启动回复通过以后,前端任务还要在代码阶段继续收口。本文接着“新增筛选项”演示,说明我会让 Codex 交出行为证据、页面证据规则证据,避免 GitHub Skill 只停留在任务开头。

MrSun666的博客 587

flask基于GCN的垃圾评论识别系统设计与实现

摘 要 针对传统文本分类方法在挖掘评论间关联特征的不足,本研究设计并实现了一种基于图卷积网络(GCN)的垃圾评论识别系统。系统采用Flask框架搭建Web应用,通过TF-IDF算法提取评论文本特征,结合内容相似度构建图结构数据,利用两层GCN模型进行节点特征聚合与分类预测。实验结果表明,在YelpZip数据集上垃圾评论识别准确率达85.6%,单条评论分析响应时间小于2秒,批量处理千条数据平均耗时38秒。系统通过可视化界面支持实时检测与文件上传功能,验证了图神经网络在文本关联分析中的有效性,为中小平台的内

weixin_41915110的博客 146

零基础入门python58:FastAPI 缓存抽象与失效

上一篇练习围绕“统一异常错误响应”。参考做法是先运行上一篇的测试,再用一个成功请求一个失败请求验证边界;本篇在同一项目上增加新能力。

a1250467048的博客 176

【无标题】

依照利益相关方需求基线来管理所有利益相关方需求的变更,以确保识别技术利益相关方需要的变化而带来的改进,以及确保受变化影响的人能够评估影响风险,并启动适当的变更控制缓解措施。3)建立了变更机制,以便基于利益相关方需要的变化,评估利益相关方需求的变更并将其纳入需求基线;6)识别了因技术或利益相关方需要的变化而引发的变更,评估相关的风险并管理其带来的影响5。,目标运行硬件环境以及其它影响客户需求的文档来获取并定义利益相关方的需求要求。需求变化可有不同的来源,例如技术利益相关方需求的变化、法律约束。

joanna_xiao的博客 234

Pytest 快速入门|接口自动化如何添加批量断言,生成测试报告

前言很多同学写自动化脚本只会零散写 assert 断言,用普通 Python 脚本执行,没有统一用例管理、没有可视化测试报告。 学会 Pytest

2601_96229893的博客 242

技术案例:使用华为云码道(CodeArts)智能体开发鸿蒙徒步行程记录App

项目名称:HikingTracker — 徒步行程记录应用开发工具:华为云码道(CodeArts)代码智能体目标平台开发日期:2026年9月1日项目路径API版本格式差异:HarmonyOS API 10-25 使用'平台版本(API级别)'格式(如),API 26+ 使用'26.0.0'格式。降级时必须匹配平台版本与API级别,否则构建报错。模拟器镜像管理可查看所有可用镜像,--force参数可强制重新下载。镜像约2.17GB,下载需预留充足时间。API兼容性验证在目标API级别不存在,需改用。

新科技观察员的专栏 194

MakerHub 创客工坊:我 DeepSeek 从零共建的个人技术网站

MakerHub 是由我与 DeepSeek 模型协作设计并完整开发的个人技术项目集网站—— 它把每一步深度学习、智能体、Docker 的学习痕迹,变成一座可以自在浏览、连代码都能直接看的技术展厅。整个网站从零共建:没有套模板、没有用现成的建站平台,从设计系统、内容管线到代码浏览器的每一个字节,都是我与模型反复讨论、测试、打磨出来的。

zylyw123的博客 149

最新缠论全指标主图.tn6

通达信最新缠论全指标主图.tn6

上一篇: ccproxy 6.61 注册机(纯绿/傻瓜/真正去除线程限制)
下一篇: 关于C++中RTTI的思考
i53nd
博客等级 码龄18年 14粉丝 21原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值