realloc 导致程序崩溃???

树先生 2010-07-14 05:10:35

if(nReallocLen > pVideoInfo->nBufLen) //如果原来的大小pVideoInfo->nBufLen小于所需的空间大小nReallocLen则realloc
{
char* chTmp = NULL;
chTmp = (char*) realloc(pVideoInfo->chaBuf,nReallocLen);
if(!chTmp)
{
cout<<"Realloc failed!"<<endl;
return 0;
}
else
{
cout<<"Realloc success!"<<endl;
pVideoInfo->chaBuf = chTmp;
pVideoInfo->nBufLen = nReallocLen; //成功申请后内存大小赋值
}

}



*** glibc detected *** ./New_Player: realloc(): invalid next size: 0x0806d990 ***
======= Backtrace: =========
/lib/libc.so.6[0xb726e911]
/lib/libc.so.6[0xb7271598]
/lib/libc.so.6(__libc_realloc+0x100)[0xb72726b0]
./New_Player[0x806117c]
./New_Player[0x80506a0]
./New_Player[0x804b937]
./New_Player[0x804b9c3]
./New_Player[0x8055f6e]
/lib/libpthread.so.0[0xb7fb934b]
/lib/libc.so.6(__clone+0x5e)[0xb72c865e]
======= Memory map: ========
08048000-08068000 r-xp 00000000 08:05 1462725 /home/xxr/Ver02/Media/PlayServer/New_Player
08068000-08069000 rw-p 00020000 08:05 1462725 /home/xxr/Ver02/Media/PlayServer/New_Player
08069000-0e23c000 rw-p 08069000 00:00 0 [heap]
b57f1000-b57f2000 ---p b57f1000 00:00 0
b57f2000-b58f2000 rwxp b57f2000 00:00 0
b58f2000-b58f3000 ---p b58f2000 00:00 0
b58f3000-b59f3000 rwxp b58f3000 00:00 0
b59f3000-b59f4000 ---p b59f3000 00:00 0
b59f4000-b5af4000 rwxp b59f4000 00:00 0
b5af4000-b5af5000 ---p b5af4000 00:00 0
b5af5000-b5bf5000 rwxp b5af5000 00:00 0
b5bf5000-b5bf6000 ---p b5bf5000 00:00 0
b5bf6000-b5cf6000 rwxp b5bf6000 00:00 0
b5cf6000-b5cf7000 ---p b5cf6000 00:00 0
b5cf7000-b5df7000 rwxp b5cf7000 00:00 0
b5df7000-b5df8000 ---p b5df7000 00:00 0
b5df8000-b5ef8000 rwxp b5df8000 00:00 0
b5ef8000-b5ef9000 ---p b5ef8000 00:00 0
b5ef9000-b5ff9000 rwxp b5ef9000 00:00 0
b5ff9000-b5ffa000 ---p b5ff9000 00:00 0
b5ffa000-b60fa000 rwxp b5ffa000 00:00 0
b60fa000-b60fb000 ---p b60fa000 00:00 0
b60fb000-b61fb000 rwxp b60fb000 00:00 0
b61fb000-b61fc000 ---p b61fb000 00:00 0
b61fc000-b62fc000 rwxp b61fc000 00:00 0
b62fc000-b62fd000 ---p b62fc000 00:00 0
b62fd000-b63fd000 rwxp b62fd000 00:00 0
b63fd000-b63fe000 ---p b63fd000 00:00 0
b63fe000-b64fe000 rwxp b63fe000 00:00 0
b64fe000-b64ff000 ---p b64fe000 00:00 0
b64ff000-b65ff000 rwxp b64ff000 00:00 0
b65ff000-b6600000 ---p b65ff000 00:00 0
b6600000-b6700000 rwxp b6600000 00:00 0
b6700000-b6721000 rw-p b6700000 00:00 0
b6721000-b6800000 ---p b6721000 00:00 0
b6821000-b6822000 ---p b6821000 00:00 0
b6822000-b6922000 rwxp b6822000 00:00 0
b6922000-b6923000 ---p b6922000 00:00 0
b6923000-b6a23000 rwxp b6923000 00:00 0
b6a23000-b6a24000 ---p b6a23000 00:00 0
b6a24000-b6b24000 rwxp b6a24000 00:00 0
b6b24000-b6b25000 ---p b6b24000 00:00 0
b6b25000-b6c25000 rwxp b6b25000 00:00 0
b6c25000-b6c26000 ---p b6c25000 00:00 0
b6c26000-b6d26000 rwxp b6c26000 00:00 0
b6d26000-b6d27000 ---p b6d26000 00:00 0
b6d27000-b6e27000 rwxp b6d27000 00:00 0
b6e27000-b6e28000 ---p b6e27000 00:00 0
b6e28000-b6f28000 rwxp b6e28000 00:00 0
b6f28000-b6f5b000 r--p 00000000 08:05 15201 /usr/lib/locale/zh_CN/LC_CTYPE
b6f5b000-b6fbc000 r--p 00000000 08:05 15333 /usr/lib/locale/zh_CN/LC_COLLATE
b6fbc000-b6fbe000 rw-p b6fbc000 00:00 0
b6fbe000-b6fcf000 r-xp 00000000 08:05 12465 /lib/libnsl-2.4.so
b6fcf000-b6fd1000 rw-p 00010000 08:05 12465 /lib/libnsl-2.4.so
b6fd1000-b6fd3000 rw-p b6fd1000 00:00 0
b6fd3000-b6fd5000 r-xp 00000000 08:05 12460 /lib/libdl-2.4.so
b6fd5000-b6fd7000 rw-p 00001000 08:05 12460 /lib/libdl-2.4.so
b6fd7000-b7171000 r-xp 00000000 08:05 111704 /opt/oracle/product/10.2/db_1/lib/libnnz10.so
b7171000-b7209000 rw-p 00199000 08:05 111704 /opt/oracle/product/10.2/db_1/lib/libnnz10.so
b7209000-b720b000 rw-p b7209000 00:00 0
b720b000-b7324000 r-xp 00000000 08:05 12454 /lib/libc-2.4.so
b7324000-b7326000 r--p 00118000 08:05 12454 /lib/libc-2.4.so
b7326000-b7328000 rw-p 0011a000 08:05 12454 /lib/libc-2.4.so
b7328000-b732b000 rw-p b7328000 00:00 0
b732b000-b7335000 r-xp 00000000 08:05 16327 /lib/libgcc_s.so.1
b7335000-b7336000 rw-p 00009000 08:05 16327 /lib/libgcc_s.so.1
b7336000-b7337000 rw-p b7336000 00:00 0
b7337000-b735a000 r-xp 00000000 08:05 12462 /lib/libm-2.4.so
b735a000-b735c000 rw-p 00022000 08:05 12462 /lib/libm-2.4.so
b735c000-b7431000 r-xp 00000000 08:05 17040 /usr/lib/libstdc++.so.6.0.8
b7431000-b7434000 r--p 000d5000 08:05 17040 /usr/lib/libstdc++.so.6.0.8
b7434000-b7436000 rw-p 000d8000 08:05 17040 /usr/lib/libstdc++.so.6.0.8
b7436000-b743c000 rw-p b7436000 00:00 0
b743c000-b7e9c000 r-xp 00000000 08:05 124302 /opt/oracle/product/10.2/db_1/lib/libclntsh.so.10.1
b7e9c000-b7f9d000 rw-p 00a5f000 08:05 124302 /opt/oracle/product/10.2/db_1/lib/libclntsh.so.10.1
b7f9d000-b7fb4000 rw-p b7f9d000 00:00 0
b7fb4000-b7fc4000 r-xp 00000000 08:05 12480 /lib/libpthread-2.4.so
b7fc4000-b7fc6000 rw-p 0000f000 08:05 12480 /lib/libpthread-2.4.so
b7fc6000-b7fc8000 rw-p b7fc6000 00:00 0
b7fc8000-b7fc9000 r--p 00000000 08:05 15331 /usr/lib/locale/zh_CN/LC_NUMERIC
b7fc9000-b7fca000 r--p 00000000 08:05 15208 /usr/lib/locale/zh_CN/LC_TIME
b7fca000-b7fcb000 r--p 00000000 08:05 15205 /usr/lib/locale/zh_CN/LC_MONETARY
b7fcb000-b7fcc000 r--p 00000000 08:05 15204 /usr/lib/locale/zh_CN/LC_MESSAGES/SYS_LC_MESSAGES
b7fcc000-b7fcd000 r--p 00000000 08:05 15330 /usr/lib/locale/zh_CN/LC_PAPER
b7fcd000-b7fce000 r--p 00000000 08:05 15206 /usr/lib/locale/zh_CN/LC_NAME
b7fce000-b7fcf000 r--p 00000000 08:05 15200 /usr/lib/locale/zh_CN/LC_ADDRESS
b7fcf000-b7fd0000 r--p 00000000 08:05 15207 /usr/lib/locale/zh_CN/LC_TELEPHONE
b7fd0000-b7fd1000 r--p 00000000 08:05 15332 /usr/lib/locale/zh_CN/LC_MEASUREMENT
b7fd1000-b7fd8000 r--s 00000000 08:05 12869 /usr/lib/gconv/gconv-modules.cache
b7fd8000-b7fd9000 r--p 00000000 08:05 15202 /usr/lib/locale/zh_CN/LC_IDENTIFICATION
b7fd9000-b7fda000 rw-p b7fd9000 00:00 0
b7fda000-b7ff4000 r-xp 00000000 08:05 12447 /lib/ld-2.4.so
b7ff4000-b7ff6000 rw-p 00019000 08:05 12447 /lib/ld-2.4.so
bfc78000-bfc8c000 rwxp bfc78000 00:00 0 [stack]
bfc8c000-bfc8d000 rw-p bfc8c000 00:00 0
ffffe000-fffff000 ---p 00000000 00:00 0 [vdso]

...全文
717 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
树先生 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gelu1040 的回复:]

if(!chTmp)

relloc失败就返回0?
[/Quote]
有什么问题吗?
这只是一个代码片段,外围有一个循环机制,返回0后下次循环的时候还会尝试realloc
gelu1040 2010-07-15
  • 打赏
  • 举报
回复
if(!chTmp)

relloc失败就返回0?
树先生 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 freshui 的回复:]

invalid next size: 0x0806d990
可不是指的是参数nReallocLen的值

堆也是一块格式化好的数据结构,俗的讲可以看是两个链表,一个是已用的,一个是未用的,一般上标记的链表指针也是和普通数据一样存在同样的一片内存中的,如果你越界写,刚好把这个控制信息给写坏了,就会出错
[/Quote]
我也觉得不是指的nReallocLen的值。
从昨天重启到现在又没挂,也找不到什么原因。。。
只有等再挂的时候看日志了
yunyun1886358 2010-07-15
  • 打赏
  • 举报
回复
#12楼的意思是堆中下一块空闲内存的size被错误改写为0x0806d990了?

以下纯属个人理解,不知对否:
“刚好把这个控制信息给写坏了”那么堆的这个控制信息保存在哪里?是在用户程序的内存区,还是操作系统在管理?个人认为如果堆的这个控制信息这么容易破坏,那么内存访问机制脆弱了点。
freshui 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xxrlily 的回复:]
引用 12 楼 freshui 的回复:

invalid next size: 0x0806d990
可不是指的是参数nReallocLen的值

堆也是一块格式化好的数据结构,俗的讲可以看是两个链表,一个是已用的,一个是未用的,一般上标记的链表指针也是和普通数据一样存在同样的一片内存中的,如果你越界写,刚好把这个控制信息给写坏了,就会出错

我也觉得不是指的nReallocLen……
[/Quote]
比如你分配内存后,得到的地址是0x80300000, 长度是0x200
那么地址0x802FFFF0位置放的就是控制信息,表明下一个内存block被使用了,同时该信息指明接下来可用的一个block地址在0x80300200开始。

当这些控制信息被你因为越界给写坏了,内存的分配和释放就会出错,因为这些操作要根据这些信息找到你要释放的区域,做好标记为已释放。同时如果有两个相连的区块都是标记为已释放的话,需要再做一个merge动作。

一个比较流行的dlmalloc内存分配器的介绍可以参考这个:
http://blog.chinaunix.net/u/26524/showart_1946446.html
如果你有兴趣深入研究的话
freshui 2010-07-14
  • 打赏
  • 举报
回复
invalid next size: 0x0806d990
可不是指的是参数nReallocLen的值

堆也是一块格式化好的数据结构,俗的讲可以看是两个链表,一个是已用的,一个是未用的,一般上标记的链表指针也是和普通数据一样存在同样的一片内存中的,如果你越界写,刚好把这个控制信息给写坏了,就会出错
野男孩 2010-07-14
  • 打赏
  • 举报
回复
*** glibc detected *** ./New_Player: realloc(): invalid next size: 0x0806d990 ***

invalid next size: 0x0806d990
elegant87 2010-07-14
  • 打赏
  • 举报
回复
可能是越界了
freshui 2010-07-14
  • 打赏
  • 举报
回复
堆被写坏了吧,看看是不是哪里写越界了
yunyun1886358 2010-07-14
  • 打赏
  • 举报
回复
问题应该是出在nReallocLen上,长度太大了0x0806d990。楼主检查下为什么nReallocLen会这么大。
artcpp 2010-07-14
  • 打赏
  • 举报
回复
问题不在realoc上
skyworth98 2010-07-14
  • 打赏
  • 举报
回复
问题出在红色的位置,貌似0x0806d990这个期望的大小无法满足……
把nReallocLen的值打出来看看,应该就是这个问题
貌似是什么地方跑飞了


*** glibc detected *** ./New_Player: realloc(): invalid next size: 0x0806d990 ***
======= Backtrace: =========
/lib/libc.so.6[0xb726e911]
/lib/libc.so.6[0xb7271598]
/lib/libc.so.6(__libc_realloc+0x100)[0xb72726b0]
./New_Player[0x806117c]
./New_Player[0x80506a0]
./New_Player[0x804b937]
./New_Player[0x804b9c3]
./New_Player[0x8055f6e]
/lib/libpthread.so.0[0xb7fb934b]
lazy_2010 2010-07-14
  • 打赏
  • 举报
回复
貌似 nReallocLen 太大了,是不是某个地方代码写飞了,导致这个数据太大?
树先生 2010-07-14
  • 打赏
  • 举报
回复
跟chaTmp是没关系的
出现崩溃的情况很少见,这是一个服务器程序,跑了两天都没事,就上午挂了一下,重启以后也没出现
树先生 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cgb0210 的回复:]

作用域问题,你把 char* chTmp = NULL; 定义在这个if语句外面试试。
干嘛不直接写成
pVideoInfo->chaBuf= (char*) realloc(pVideoInfo->chaBuf,nReallocLen);
[/Quote]
直接那样写 如果分配不成功那么pVideoInfo->chaBuf(realloc的返回值)就变成NULL了,而pVideoInfo->chaBuf原先指向的内存不会释放,会造成内存泄露
C你 2010-07-14
  • 打赏
  • 举报
回复
作用域问题,你把 char* chTmp = NULL; 定义在这个if语句外面试试。
干嘛不直接写成
pVideoInfo->chaBuf= (char*) realloc(pVideoInfo->chaBuf,nReallocLen);
树先生 2010-07-14
  • 打赏
  • 举报
回复
请问是什么原因呢
realloc 的时候我也加了临时指针,realloc成功才使用的

64,687

社区成员

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

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