realloc

liujiaji 2010-07-12 02:39:51
int _tmain(int argc, _TCHAR* argv[])
{
char *buf1 = NULL;
char *temp1 = NULL;
char *temp2 = NULL;

for (int i = 1 ; i<1000; i++)
{
temp1 = buf1 = (char*)realloc(buf1,1000*i);
memset(buf1,'\0',1000*i);
#if 1
if (temp1 != temp2)
{
if ( temp2 != NULL)
{
free(temp2);
temp2 = NULL;
}
temp2 = buf1;
}
#endif
}
if(buf1)
free(buf1);
buf1 = NULL;


getchar();
return 0;
}.

就是想了解realloc在扩张申请空间得不到满足的时候,是另外开辟一个连续空间,而且系统会将原来的块数据拷贝到新块里面.

这是不是处问题了?如果原来的块不用,是不是应该释放掉?我上面的程序就是这个思想来测试一下,可是一运行到红字体部分,程序就出错误,错误提示:This may be due to a corruption of the heap, and indicates a bug in gdg.exe or any of the DLLs it has loaded.

根据错误提示,可能原因是:
1. 访问已经被释放的内存
2. 再次释放已经被释放过的内存

所以不知道到底怎么回事了??
...全文
90 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-07-12
  • 打赏
  • 举报
回复
顶了。
walkersfaint 2010-07-12
  • 打赏
  • 举报
回复
free(temp2);
你的temp2在哪申请的空间????
我貌似没看到
liujiaji 2010-07-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20091209/10/95E913E9-1042-45D7-A3C3-77180AEF7485.html

这个帖子里也是说没事,但是我看内存管理器,有泄漏啊!
liujiaji 2010-07-12
  • 打赏
  • 举报
回复
找了些资料看看,都说是相当于自动被释放掉。为什么说“相当于”呢?realloc 后的内存起始地址可能与原来相等,也可能是在新的地址。对于后者,就是分配新空间,释放旧空间;对于前者,并没有实际的“分配”“释放”操作,只是修改了原内存块的大小,当作用相当于释放原空间,分配新空间

但是我上面的那个程序运行有内存泄露啊!


liujiaji 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 skyworth98 的回复:]

为temp1分配过内存么?
[/Quote]
temp1 = buf1 = (char*)realloc(buf1,1000*i);
skyworth98 2010-07-12
  • 打赏
  • 举报
回复
为temp1分配过内存么?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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