关于delete……

s__c__007 2009-03-08 05:27:06
用new申请完内存之后
用delete 释放内存时,语句为
delete []p;
而中括号内无须声明申请内存的个数
请问为什么啊??
谢谢各位高手~
...全文
61 4 打赏 收藏 转发到动态 举报
写回复
用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的时候只要把内存地址传给它就行了

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧