2013-08-06 46 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在堆栈中。如果它始终是相同的值,那么可以尝试追踪它的位置。

相关问题