为什么这样没有内存泄露

jsjwql 2007-09-20 10:54:55
学c++的都知道,用new创建一个数组的时候,记得用delete[]来删除,否则的话会造成内存泄露。
今天做了一个测试发现的结果确不是这样的,我用的开发工具是VS2005
int *p = new int[10];
int *head = p; //record the address of this array
for (int i = 0; i<5; i++)
{
*p = i;
p++;
}

delete head; //replace delete[] head;
我用vs自带的工具memory观察了内存分配过程,以及释放过程,发现居然不是我想象的只释放第一个数据对象*head,而是整个数组空间都被释放了。

为了确认,我还用DoundsChecker 检查了一遍,没内存泄露。

请问这是什么原因?还是microsoft在vs2005做的优化处理?
...全文
168 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjwql 2007-09-20
  • 打赏
  • 举报
回复
我已经查阅了下effecitve c++,按照scott的意思,即使是用简单类型如int,也可能产生不可预期的问题。所以new/delete new[]/delete[] 是必须要配套使用的。
那我们如果想从一个函数里面返回一个数组,像下面这样
int* test()
{
int *p = new int[10];
int *head = p; //record the address of this array
for (int i = 0; i<5; i++)
{
*p = i;
p++;
}

return head;

}

如果想从外面调用的话:
int* array = test();
我们是不是要delete[] array来删除new出来的空间,如果使用者不知道函数内部是怎么分配内存的话,很容易直接用delete array,这样的函数设计是不是不合理? 个人认为还可以用malloc/free的方式。
arong1234 2007-09-20
  • 打赏
  • 举报
回复
delete/delete[]可以在简单类型用似乎是为了兼容老代码
不过使用正确的操作符还是应该的

我们应该尽量把自己代码写对,而不要去探索如果我写不对结果会如何
arong1234 2007-09-20
  • 打赏
  • 举报
回复
所谓简单类型不包括类、结构、union,当然不包括string类型
xugang_2001 2007-09-20
  • 打赏
  • 举报
回复
关于new/delete new[]/delete[] 是必须要配套使用的,这个大师们都讲过了,因为后果是不可预料的,所以不要以为这样没问题就可以混淆使用,结果是为定义的东西你还用么.即时正确了也是侥幸.
taodm 2007-09-20
  • 打赏
  • 举报
回复
自己去看《Effective C++》2e item 5 / 3e item 16
jsjwql 2007-09-20
  • 打赏
  • 举报
回复
int *p = new int[10];
换成string * p = new string[10];
再试试
--------------
结果抛出异常,delete[]就没有问题了
jsjwql 2007-09-20
  • 打赏
  • 举报
回复
简单类型或者负责类型的标准是怎么样的,像string算不算简单的?
arong1234 2007-09-20
  • 打赏
  • 举报
回复
为什么该有内存泄漏?你内存不是已经释放了么?delete[]和delete对简单类型是一样得
goodluckyxl 2007-09-20
  • 打赏
  • 举报
回复
delete head; //replace delete[] head;
这个没带[] 有可能导致泄露
有些时候你申请他还是可以释放干净的
taodm 2007-09-20
  • 打赏
  • 举报
回复
int *p = new int[10];
换成string * p = new string[10];
再试试

64,678

社区成员

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

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