作者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