社区
C++ 语言
帖子详情
关于delete……
s__c__007
2009-03-08 05:27:06
用new申请完内存之后
用delete 释放内存时,语句为
delete []p;
而中括号内无须声明申请内存的个数
请问为什么啊??
谢谢各位高手~
...全文
61
4
打赏
收藏
关于delete……
用new申请完内存之后 用delete 释放内存时,语句为 delete []p; 而中括号内无须声明申请内存的个数 请问为什么啊?? 谢谢各位高手~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pengzhixi
2009-03-08
打赏
举报
回复
[Quote=引用楼主 s__c__007 的帖子:]
用new申请完内存之后
用delete 释放内存时,语句为
delete []p;
而中括号内无须声明申请内存的个数
请问为什么啊??
谢谢各位高手~
[/Quote]
delete[]p;是针对new数组来的,实际上老版本的c++在[]里面是要注明你分配的数量的。但是后面的版本不需要,因为一般在new分配的数组返回的地址前面4个字节里面记载了分配的内存空间的大小。所以delete[]p的中括号里面不需要注明分配内存的大小。
s__c__007
2009-03-08
打赏
举报
回复
谢谢
膜拜一下~
liao05050075
2009-03-08
打赏
举报
回复
对于系统自有的数据类型,语言本身就能区分内存块的大小,而对于自定义数据类型(如我们自定义的类),则 operator new 和 operator delete 之间需要互相传递信息。
当我们使用 operator new 为一个自定义类型对象分配内存时,实际上我们得到的内存要比实际对象的内存大一些,这些内存除了要存储对象数据外,还需要记录这片内存的大小,此方法称为 cookie.这一点上的实现依据不同的编译器不同。(例如 MFC 选择在所分配内存的头部存储对象实际数据,而后面的部分存储边界标志和内存大小信息。g++ 则采用在所分配内存的头 4 个自己存储相关信息,而后面的内存存储对象实际数据。)当我们使用 delete operator 进行内存释放操作时,delete operator 就可以根据这些信息正确的释放指针所指向的内存块。
以上论述的是对于单个对象的内存分配/释放,当我们为数组分配/释放内存时,虽然我们仍然使用 new operator 和 delete operator,但是其内部行为却有不同:new operator 调用了operator new 的数组版的兄弟- operator new[],而后针对每一个数组成员调用构造函数。而 delete operator 先对每一个数组成员调用析构函数,而后调用 operator delete[] 来释放内存。需要注意的是,当我们创建或释放由自定义数据类型所构成的数组时,编译器为了能够标识出在 operator delete[] 中所需释放的内存块的大小,也使用了编译器相关的 cookie 技术。
文章出处:http://www.diybl.com/course/3_program/c++/cppjs/2008106/148074.html
liao05050075
2009-03-08
打赏
举报
回复
使用new申请内存后,系统有记录它申请的内存的大小。于是delete的时候只要把内存地址传给它就行了
delete
和
delete
[]的真正区别
本文深入解析了C++中
delete
与
delete
[]的使用方式及其区别,包括简单类型与类对象数组的内存释放,通过实例代码演示了两者在内存管理上的差异,并强调了正确使用
delete
[]的重要性以避免内存泄漏。
delete
和
delete
[]的理解
本文详细解释了C++中
delete
和
delete
[]的区别,强调了为何不能混用。
delete
用于释放单个对象,而
delete
[]用于释放数组对象。在释放数组对象时,
delete
[]会调用每个元素的析构函数,而
delete
只会调用一次。此外,文章揭示了编译器如何通过在数组前存储长度信息来实现
delete
[]的功能,并通过实例展示了误用
delete
释放数组对象可能导致的问题。
C++中
delete
和
delete
[]的真正区别
本文详细探讨了C++中
delete
和
delete
[]的区别,包括它们在释放内存时的不同行为,特别是在处理对象数组时的内存管理和析构函数调用。文章指出,对于基本类型或无析构函数的对象,
delete
和
delete
[]可以互换使用,但对于有析构函数的对象数组,必须使用
delete
[]以避免内存泄漏和程序异常。此外,文章通过实例解释了new[]如何存储元素数量以及为何
delete
[]需要这个信息来正确调用析构函数。
MySQL
delete
语句
本文深入探讨MySQL中
DELETE
语句的三个层次:基础条件删除、使用INNER JOIN子句进行复杂删除以及ON
DELETE
CASCADE实现级联删除。通过具体示例,讲解如何在不同场景下高效运用
DELETE
语句。
C++中的
delete
与
delete
[]
本文探讨了C++中
delete
和
delete
[]在回收内存时的区别。
delete
用于释放单个对象,
delete
[]用于释放对象数组。当释放自定义类型数组时,使用
delete
[]会确保每个对象调用析构函数,而
delete
仅调用一次析构函数。对于基本类型数组,两者均可,但类对象数组必须使用
delete
[]。总结来说,new[]与
delete
[]配对,new与
delete
配对。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章