【发布时间】:2013-11-22 02:02:10
【问题描述】:
最近遇到内存释放问题。首先,打击是C代码:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int *p =(int*) malloc(5*sizeof (int));
int i ;
for(i =0;i<5; i++)
p[i ]=i;
p[i ]=i;
for(i =0;i<6; i++)
printf("[%p]:%d\n" ,p+ i,p [i]);
free(p );
printf("The memory has been released.\n" );
}
显然,存在内存超出范围的问题。当我使用 VS2008 编译器时,它会给出以下输出和一些关于内存释放的错误:
[00453E80]:0
[00453E84]:1
[00453E88]:2
[00453E8C]:3
[00453E90]:4
[00453E94]:5
但是当我使用 cygwin 的 gcc 4.7.3 编译器时,我得到以下输出:
[0x80028258]:0
[0x8002825c]:1
[0x80028260]:2
[0x80028264]:3
[0x80028268]:4
[0x8002826c]:51
The memory has been released.
显然,代码运行正常,但5没有写入内存。 所以VS2008和gcc在处理这些问题上可能存在一些差异。 各位大神能不能给个专业的解释?提前致谢。
【问题讨论】:
-
您为 5 个项目分配了空间,但索引超出了分配量的末尾。这是未定义的行为,任何事情都可能发生。
-
您的第二个 for 循环超出了分配的范围。 p[5] 就是当时内存中的任何值。
-
糟糕,我没有看到多余的 p[i] = i,这意味着最后一个值应该是 5。不确定 gcc 在那里做了什么。
标签: c++ c visual-studio-2008 gcc