首页 新闻 会员 周边 捐助

系统如何知道delete p 要释放多大的内存

0
悬赏园豆:5 [已解决问题] 解决于 2012-04-08 23:05

int *p = new int[10];

delete []p;

系统delete的时候,怎么知道new了多大的内存?

猜测可能:另外有一个地方维护一个结构,delete的时候查询一下这个大小?

左手程序右手诗的主页 左手程序右手诗 | 初学一级 | 园豆:82
提问于:2012-03-08 11:54
< >
分享
最佳答案
1
收获园豆:5
zsounder | 老鸟四级 |园豆:2819 | 2012-03-12 10:28
其他回答(5)
0

高深,帮顶

会长 | 园豆:12463 (专家六级) | 2012-03-08 12:08
0

系统在delete之前不知道p有多大

在delete的时候要把p占用的内存全部释放出来,

这应该是类似一个遍历链表的工作

开发人员不必关心。

liulun | 园豆:257 (菜鸟二级) | 2012-03-08 12:49
0

我作了实验,在vs2010下 delete p释放了整个数组的内存;但用g++下delete p仅释放数组的第一个元素。所以由此可见,之所以delete“知道”new了多大的内存完全是编译器在搞鬼,我想这是微软防止内存泄漏而为开发者所作的“多此一举”。还有很多微软的编译器都跟GNU处理不一样,如数组越界,微软的报错,而GNU不过问,由程序员自己检查。所以说要想学pure C++,那还是用GNU的编译器吧,微软的编译器坑爹啊

neil90 | 园豆:220 (菜鸟二级) | 2012-03-08 15:30

你是怎么测试的?

sorry 我不知道如何使用G++

支持(0) 反对(0) 左手程序右手诗 | 园豆:82 (初学一级) | 2012-03-08 16:37

@左手程序右手诗: 就是测试其实就是调试,观察delete p 后  数据里面的元素的值有没有改变,如果对调试不熟悉,你也可以使用printf来观察

支持(0) 反对(0) neil90 | 园豆:220 (菜鸟二级) | 2012-03-08 16:41
0

这个写错了吧  应该是delete[] p,还有至于你问的问题实际上并不是楼上所说的,就像这个例子为什么不能delete p;而要delete[] p;前者p只是一个指针指向数组0号的元素,会造成内存泄漏,后者就是提供了人为的一些帮助加了[]系统才知道是要删除一个数组或者一个链表或者其他数据结构,系统会“记住”要删除多大的内存空间10*sizeof(int)。delete 的释放工作,从原则上说是在析构函数内完成的。为什么它能正确释放?因为析构函数是知道大小的,不管是自定义类还是系统原有类型比如int,我认为其实都是有“析构函数”的,当然这里的“析构函数”不是我们常见的,具体的有兴趣的可以去深究一下

Daywei | 园豆:551 (小虾三级) | 2012-03-08 15:34

你去用微软的编译器试试就知道楼主为什么会这么问了,你所说的只是解释delete理论应当处理什么,但你实践一下就会发现用微软的编译器即时是delete p 它也不会内存泄漏

支持(0) 反对(0) neil90 | 园豆:220 (菜鸟二级) | 2012-03-08 16:04

sorry, 我写错了。我改为delete []p了。

谢谢的回答。

支持(0) 反对(0) 左手程序右手诗 | 园豆:82 (初学一级) | 2012-03-08 16:39

@hustor: 不好意思,我说的楼上的不是说的你,当时我写的时候你还没发表出来,等我发出来的时候你的回答已经在了,你说的我并没有去实践,可能你说的是正确的

支持(0) 反对(0) Daywei | 园豆:551 (小虾三级) | 2012-03-11 11:26
1

你的猜测是对的。分配内存的时候实际上在起始处有一个标签记录这这块内存的连续长度。想了很久。。没想起来是哪本书。可能是那本传说中的操作系统黑皮,也可能某本讲C++的,比如对象模型或者设计与演化。。呃。。。但我十分确定你的猜测是对的。

mumuliang | 园豆:213 (菜鸟二级) | 2012-03-20 10:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册