免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 39649 | 回复: 26
打印 上一主题 下一主题

realloc 出错:"*** glibc detected *** double free or corruption" [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-04 16:32 |只看该作者 |倒序浏览
最近写个小测试程序,分解文件的数据写入到指定的结构,所以动态分配内存并使用realloc动态增加内存的长度,以便用qsort为这块内存的结构做排序操作。

问题:在32位机上,最大测试六千条数据,也就是可以分解出六千个结构,每个结构长度大约两百字节。没有任何问题。

      在64位机,相同的程序,当结构分配近一千个时,就会报内存无法访问错误:Segmentation fault(SIGSEGV)


有遇到过此问题的吗?请指教。

[ 本帖最后由 linternt 于 2006-9-5 11:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-09-04 16:50 |只看该作者
看了点资料,这个问题应该是realloc重新分配内存区,也就是重新拷贝数据到另一块内存区域造成的。

论坛徽章:
0
3 [报告]
发表于 2006-09-05 11:01 |只看该作者
查了点资料,知道是GCC版本的问题,每次realloc重新指向一块的新的内存区的时候,也就是指针头位置改变的时候,对内存的操作就会报:
*** glibc detected *** double free or corruption (!prev): 0x0000000000503130 ***

有遇到同样问题的吗,我现在还没找到好的解决办法。

论坛徽章:
0
4 [报告]
发表于 2006-09-05 11:59 |只看该作者
可能是对同一块内存区free了两次造成的

原帖由 linternt 于 2006-9-5 11:01 发表
查了点资料,知道是GCC版本的问题,每次realloc重新指向一块的新的内存区的时候,也就是指针头位置改变的时候,对内存的操作就会报:
*** glibc detected *** double free or corruption (!prev): 0x00000000005 ...

论坛徽章:
0
5 [报告]
发表于 2006-09-05 15:20 |只看该作者
不是的,无论realloc后是否调用free都会有这个错误。程序终止。

AS4上把环境变量MALLOC_CHECK_=0可避免GLIBC对内存的检查,并不终止程序。

但是,如果realloc重新指向到一块新的内存时,仍然会出现内存非法访问的错误。GCC低版本不存这个问题。

我的是GCC3.4.3

论坛徽章:
0
6 [报告]
发表于 2006-09-05 15:35 |只看该作者
一定是free了一个还被另一个指针引用的空间了.
好好看看代码吧. 还有realloc的空间,也不要再引用了.

论坛徽章:
0
7 [报告]
发表于 2006-09-05 17:19 |只看该作者
我只是用这个内存放从文件读出的数据,直到读完,指针不变,不存在其它的操作,
相同的代码在GCC的低版本没有任何问题。

你可以写个测试程序试试。realloc返回一个很大的内存地址时就报错了,看地址应该是越界。

就是不明白为什么低版本GCC不会

论坛徽章:
0
8 [报告]
发表于 2006-09-05 20:10 |只看该作者
你的结构体应该有double 、long long之类的吧

论坛徽章:
0
9 [报告]
发表于 2006-09-06 10:23 |只看该作者
全是char型,很简单的结构体。

整个函数只是退出时候才会有free调用,GDB调试发现总是到realloc返回一个很大的内存地址时出错。

例:正常:502130
     非正常:9558d010 (到此出现内存越界)

不明白为什么会出现这样的内存地址!

论坛徽章:
0
10 [报告]
发表于 2006-09-06 11:53 |只看该作者
或许是编译选项问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP