2013-08-06 43 views
1

我的程序在main()函數之前崩潰。我確定這一點使用 「CERR」:main()之前崩潰()

int main(int argc, char **argv) 
{ 
    cerr << " MAAIN " << endl; 

從gdb的消息:

Reading symbols for shared libraries ...........+++............................ done 
CA(34652) malloc: *** error for object 0x7fff76694860: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 
0x00007fff88e1782a in __kill() 
(gdb) bt 
#0 0x00007fff88e1782a in __kill() 
#1 0x00007fff8c4d2a9c in abort() 
#2 0x00007fff8c53184c in free() 
#3 0x00000001026a1db0 in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow() 
(gdb) 

我檢查了代碼, 「刪除」 和 「自由」 的功能。

if (x) delete x; 

請幫我回答兩個問題:1。 什麼可以爲可能出現的問題全部刪除與檢查這樣做呢? 2.如何找到它? (我有一個很大的代碼,有很多文件和cmake進行編譯)。

P.S.我讀Is there any way a C/C++ program can crash before main()?,但看着gdb按摩,我想圖書館是好的。

+0

你不需要'if(x)'檢查。它不添加任何東西。您正在刪除未用'new'分配的內容。 – juanchopanza

+0

juanchopanza,好主意,謝謝。但爲什麼如果(x)什麼都不做?指針初始化爲0. – klm123

+0

,因爲在空指針上調用'delete'是空操作。 – juanchopanza

回答

2

cout是不檢查你的程序崩潰,因爲cout不會立即刷新其緩衝區的好辦法,這是可能的,你的程序cout之後,但刷新緩衝區之前崩潰。最好用cerr而不是cout

而在main函數之前,全局變量的構造函數會調用。所以如果你覺得它在開始之前崩潰,請看看它們。

另一種可能性是在你調用main函數之前發生的main函數中爲數組分配內存。如果它們很大。您必須使用new爲它們分配內存。

+0

我已經改變回合cerr(具有相同的效果)。謝謝。我正在研究構造函數,但找不到任何可疑的東西。我沒有全局數組。 – klm123

+0

主函數中的任何大的局部數組都會導致這樣的問題。主函數或全局對象中是否有大數組? –

+0

它看起來像錯誤消息說,它是爲std :: string分配內存時發生的,該內存中包含一個數組。 – Lochemage

1

std::basic_stringbuf<char, std::char_traits<char>...告訴我這是std::string這是錯誤的。一種非常可能的情況是,你有一些嘗試「釋放」一個字符串的東西,這個字符串沒有被正確地構造,或者被不謹慎地使用數組所覆蓋。

或者你是依靠在不同的源文件中的某些全局變量,所以你有這樣的事情:

// main.cpp: 

... 
extern string str; // str lives in another .cpp file 
.... 
myclass x(str); // Construction using str. 

// otherfile.cpp 
string str("foobar"); 

在這種情況下,str可以不受時間x建設正在緊張施工,以及字符串是「無效的」。

沿着類似的路線有其他可能性的oodles。

這裏的地址:0x7fff76694860在堆棧中。如果它始終是相同的值,那麼可以嘗試追蹤它的位置。

相關問題