QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1735|回复: 11

C++中new与delete的问题

[复制链接]
发表于 2003-3-16 21:50:25 | 显示全部楼层 |阅读模式
int* p=new int[100];
int* p1=&(p[20]);
delete p1;
delete p;
这会怎么样?
也就是分配了一个连续的空间后,对中间的空间执行delete会怎么样?
发表于 2003-3-16 22:05:29 | 显示全部楼层
我觉得会造成内存泄漏。因为对于int* p=new int[100]; 来说,分配的是一个连续的内存空间,而delete p; 只是对一个特定的内存单元进行回收,而它后面的单元将无法得到回收。正确的应该是delete[] p;

至于delete p1; 会造成什么后果,我现在没有编译器不敢乱说。

听听牛人们的意见。
回复

使用道具 举报

 楼主| 发表于 2003-3-17 00:30:38 | 显示全部楼层
那能不能实现 一次性内存分配,然后分别管理 呢?
回复

使用道具 举报

发表于 2003-3-18 13:10:15 | 显示全部楼层
delete p1也只是删除一个int[20], 其余的没有删除, 其结果不可知, 但是肯定有内存泄漏
回复

使用道具 举报

发表于 2003-3-19 10:32:03 | 显示全部楼层
[quote:9ee3044d73="redondo"]delete p1也只是删除一个int[20], 其余的没有删除, 其结果不可知, 但是肯定有内存泄漏[/quote]

好像不是吧。窃以为int* p1=&(p[20]); 的作用是让p1指向第21个单元,因此
delete p1单单释放的是p[20]这个单元,而不是int[20]这20个单元。
回复

使用道具 举报

发表于 2003-3-19 10:34:55 | 显示全部楼层
[quote:9fff303bdf="sjinny"]那能不能实现 一次性内存分配,然后分别管理 呢?[/quote]

我不太清楚你“分别管理”的具体意思。如果说是分别进行操作的话是完全可以的,不过分配和释放内存时最好是对应的,这样可以避免内存泄漏。因为分别释放100个单元会很烦的。
回复

使用道具 举报

 楼主| 发表于 2003-3-19 12:21:12 | 显示全部楼层
CSDN上的回复之一:
--------------------------------------
回复人: Cypher(Nothing) ( ) 信誉:100  2003-3-17 23:00:30  得分:0


  
呵呵。大家如果对内存分配的底层实现不了解不要想当然,动手试一试就知道结果了。这个程序根本就无法运行,无所谓什么重复释放问题了。

楼主写的程序是根本不可能通过编译的,而改为
int* p1=&(p[20]);
后,在
delete p1;
肯定会产生异常。

因为所谓从堆里分配一块空间,实现上是多分配了几个字节(即所谓的内存Cookie,通常在所返回的指针前面),来标识这一内存块的一些信息,当调用free或delete时,就根据这个Cookie来释放内存。现在p1指向的地址向前偏移找不到正确的Cookie,就会产生异常。
--------------------------------------

如果 delete p1只是删除一个int[20], 其余的没有删除;如果我能保证由办法遍历整个数组剩下的部分,是否就可以这样分别管理呢?
我说的分别管理就是分别管理它们占用的内存资源。
请大家继续关注~~~~~
回复

使用道具 举报

发表于 2003-3-21 10:20:12 | 显示全部楼层
深奥啊~~~~~~~~~~我只知道释放数组指针要加一个[],即delete []p,至于内存cookie,太深奥了,偶不过一学生而已了
回复

使用道具 举报

发表于 2003-3-21 11:01:32 | 显示全部楼层
linux下用Kdevelop编译,运行一切正常,不同的指针可以指向同一块内存,删除指针不等同于释放内存.
回复

使用道具 举报

 楼主| 发表于 2003-3-23 21:24:46 | 显示全部楼层
我delete掉的不就是内存吗?
回复

使用道具 举报

发表于 2003-3-29 11:40:30 | 显示全部楼层
在VC下编译通过,但是运行报错。delete p1操作应该是失败的。我想可能是在linux下只完成了一部分工作,但并不是真正的释放内存空间。
回复

使用道具 举报

 楼主| 发表于 2003-3-29 16:11:10 | 显示全部楼层
看来这个问题是没法解决了,唯一值得欣慰的是:我发现我不需要这样管理空间了 :)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 06:48 , Processed in 0.059439 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表