20 12
发新话题
打印

[已解决] [HLP]动态分配数组的问题

[HLP]动态分配数组的问题

先看看代码好了~
引用:
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <string.h>   
#include "SolveHead.h"
using namespace std;

int main()
{
  
int *ptr = new int[5];  
// 在这里分配了内存
  
int *p = ptr;  // 这个是下面的失败后我故意放的一个

  
ptr[1] = 123;  // 写入值,下面操作
  
cout<<*(++ptr)<<endl;  // 这里,VS会中断警告
  
cout<<*(++p)<<endl;  // 如果把上面的删除,这行可以正常的运行,并显示123

  
delete[]  ptr;  // VS中断后的断点指示处。很奇怪,为什么在这里

  
cout<<endl<<"Press any key to exit!"<<endl;
  
getch();
  
return 0;
}
VS会产生如下警告中断

  但是,经过骨头的测试,GCC可以正常编译通过和运行~

  所以,偶想问问,这个咋了……

[ 本帖最后由 KingsamChen 于 2008-8-1 18:27 编辑 ]
附件: 您所在的用户组无法下载或查看附件

TOP

跟踪了下dgbdel.cpp。发现问题所在
只需要
delete[]  (--ptr);
即可
我在前面把ptr自增了1,导致指针移位,结果在delete的时候不是指向第一个。即
ptr == &ptr[1];

但是这里还有一个问题,GCC是如何编译通过并正常运行的?

TOP

接上面~
因为GCC是按照标准的CPP来的,所以如果他的delete删的不是首地址,而是中间的某个地址,那么前面的那些就会造成memory leaks。
为了验证,我让骨头用GCC编译下列代码
引用:
#include <iostream>

int main(){
   
while (true) {
        
int *ptr = new int[5];
        
ptr++;
        
delete [] ptr;
    }
}
结果很有意思~

这个是不含上面代码的内存测试

这个是用了上面代码的结果

运行后,程序占了100多MB的RAM,恐怖啊~~
不知道这个是GCC的设计问题还是什么~不过用GCC作为编译器的各位还是要小心了~
附件: 您所在的用户组无法下载或查看附件

TOP

.

:s023:

TOP

.

跟GCC版本有无关系?

TOP

回复 5楼 的帖子

UNK
核桃也测试下看看~

TOP

回复 5楼 的帖子

C:\Documents and Settings\Liangent>g++ --version
g++ (GCC) 3.4.5 (mingw-vista special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


C:\Documents and Settings\Liangent>

TOP

g++ (GCC) 3.4.5 (mingw-vista special)
骨头多会儿用vista了?
PS:你这样分配的内存一旦函数返回就全部没有了吧- -
Welcome to JAFTBlog:http://blog.icybear.cn

TOP

回复 8楼 的帖子

他写到死循环里去了~~

TOP

回复 8楼 的帖子

引用:
原帖由 Icybear 于 2008-8-1 12:34 AM 发表
g++ (GCC) 3.4.5 (mingw-vista special)
骨头多会儿用vista了?
PS:你这样分配的内存一旦函数返回就全部没有了吧- -
不是

[ 本帖最后由 Liangent 于 2008-8-1 09:42 编辑 ]

TOP

回复 10楼 的帖子

?~

TOP

内存泄露~~

TOP

回复 12楼 的帖子

gcc那样delete了什么?

TOP

回复 13楼 的帖子

我个人觉得,他从删除的ptr所对应的指针开始,释放后面的内存~然后ptr地址前面的就留下来了~
仅供个人参考

TOP

回复 13楼 的帖子

KC不是说了,他DELETE错地方了么~

TOP

 20 12
发新话题