作者cgl (吃水饺不吐水饺皮)
看板EE_DSnP
标题[问题] *** glibc detected ***
时间Thu Nov 24 13:15:25 2011
遇到看不出来的bug,想请教各位ˊˋ
我的程式目前执行dofile do1~do4都能正常运作,
do5执行到最後一行以前都和ref结果一样,读进最後一行
mtest>q -f 时crash了。
以ddd执行得到的错误讯息大致如下(非常长...)
*** glibc detected *** /home/Documents/hw4/memTest:corrupted double-linked list:
0x000000000064e9a0***
====== Backtrace: ========
...(许多看不懂的路径)
====== Memory map: ========
...(许多看不懂的路径)
[heap]
...
[vdso]
...
[stack]
...
[vsyscall]
Program received signal SIGABRT, Aborted.
0x00007ffff72dad05 in raise () from / lib/x86_64-linux-gne/libc.so.6
我试着用ddd trace,
up到某一层,停在
~vector()
{std::_Destory(this->_M_impl._M_start, this->_M_impl._M_finish,_M_get_Tp_allocator());}这一行
再up到顶发现停在 ~MemTest() {},
google说可能是重复free一个pointer造成***glibc detected***,
我猜是执行q - f,要destruct mtest时,处理vector<MemTestObj*> _objList和_arrList时出了问题,
但mtest的destructor里头是空的,好像没有对data member做什麽事。
真是伤脑筋阿。
麻烦各位指教~~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.25.106
1F:→ djshen:我之前发生类似问题是在MemRecycleList的reset里 11/24 13:41
2F:→ djshen:我判断_nextList是否为NULL再做delete 不过之前delete完 11/24 13:42
3F:→ djshen:没让_nextList=0 所以判断错误就free两次 11/24 13:43
4F:→ djshen:如果把do5的最後的mtr拿掉就没有问题的话 就可能是我说的 11/24 13:43
5F:→ djshen:情形吧 11/24 13:43
6F:推 gamerred:从第一行错误讯息看起来像是某个用std::list的地方炸了 11/24 13:45
7F:推 gamerred:好像没用到orz 不要理我QQ 11/24 13:50
8F:→ djshen:应该不是我说的问题 要不要检查所有delete的地方@@ 11/24 13:51
9F:推 ric2k1:感觉像是一个已经被 delete 掉的东西又再被拿出来 delete 11/24 21:27
10F:→ cgl:谢谢各位的回答! 11/24 22:03
11F:推 ric2k1:也许可以再 destructor cout 些什麽观察一下... 11/24 22:24
12F:→ cgl:想用valgrind来找bug(double free),但它会避免crash发生..ˊˋ 11/25 01:59
13F:推 ric2k1:或者你可以先把一些 code comment out 掉,看看会怎样? 11/25 02:53
14F:推 gamerred:应该是recycleList的destructor 他已经帮你递回呼叫 11/25 04:38
15F:→ gamerred:不用在自己手动删掉全部 11/25 04:39
16F:推 kickpp:要是没有在reset里再呼叫reset并不会有所谓的自动递回... 11/25 09:31
17F:推 kickpp:data member里pointer指向的物件destructor不会被自动呼叫 11/25 09:36
18F:→ djshen:list的destructor不是有呼叫reset? 11/25 10:23
19F:推 kickpp:看写法吧 可以iterative也可以recursive reset 11/25 11:59
20F:→ kickpp:只是要从最尾巴delete回来... 11/25 12:01
21F:→ kickpp:重点是_nextlist是个pointer 当class被destruct 11/25 12:04
22F:→ kickpp:就只是pointer本身被删除 而不会呼叫memrecyclelist的 11/25 12:05
23F:→ kickpp:destructor... 11/25 12:06
24F:推 yanshencun:楼上正解...刚刚也de到同样的bug 11/25 12:37
25F:→ yanshencun:因为~MemRecycleList() { reset(); } 所以如果在 11/25 12:39
26F:→ yanshencun:void MemRecycleList::reset() {...}用到delete就会 11/25 12:40
27F:→ yanshencun:自动变成recursive 在处理 11/25 12:41
28F:→ yanshencun:如果自己另外在里面写到iterative,就会重复delete 11/25 12:42
29F:推 gamerred:楼上才是正解 除非kickpp不用delete 11/25 15:36
30F:→ gamerred:不然你就是destructor里面删掉了老师写的reset();那行 11/25 15:37
31F:推 kickpp:我只是针对不会自己有自动递回这件事 我当然有写delete 11/25 17:25
32F:→ kickpp:看不懂我的意思就算了吧... 11/25 17:25
33F:推 kickpp:想要表达的大概就是2840篇里老师的推文说的观念 11/25 17:28
果然我的bug出在recycleList的reset()里面,我自作聪明把_nextList以後所有後面的
List delete掉了,现在问题解决了,非常谢谢楼上各位的洞见,真的真的非常感谢!!
(今天总算能安眠了:D)
※ 编辑: cgl 来自: 140.112.25.106 (11/25 18:36)
34F:推 gamerred:回k大:感谢你的推文 但是我们在说的是MemRecycleList 11/25 20:31
35F:→ gamerred:MemMgr自己的member data当然只有non-pointer才会递回呼 11/25 20:32
36F:→ gamerred:叫destructor >_^b 11/25 20:32
37F:→ gamerred:FYI 使用delete 会呼叫那个被指向物件的destructor 11/25 20:34
38F:→ gamerred:免得换你没听懂我们的意思 11/25 20:34
39F:推 kickpp:我只是提出destructor两种不同的想法 重复用的话就会有原po 11/25 21:26
40F:→ kickpp:的问题... 不过你这样的推文态度只会让大家不想回文罢了 11/25 21:27
41F:推 gamerred:对不起 因为我误会以为你说我说错了,刚好我确定我是对的w 11/25 21:36
42F:推 ric2k1:Good :) 大家 peace 11/25 21:37