我的程序在main()函数之前崩溃了。我用“cerr”确定了这个:
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 :(得分:2)
cout
不是检查程序崩溃位置的好方法,因为cout
没有立即刷新其缓冲区,并且您可能在cout
之后但在刷新缓冲区之前崩溃。最好使用cerr
而不是cout
在main函数之前,全局变量的构造函数将调用。如果您认为它在开始之前崩溃,那么请看看它们。
另一种可能性是在调用main函数之前在main函数中为数组分配内存。如果它们很大你必须使用new
为他们分配内存。
答案 1 :(得分: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
时构造,并且字符串是“无效”。
沿着类似的路线存在大量其他可能性。
此处的地址:0x7fff76694860
在堆栈中。如果它始终是相同的值,您可以尝试追踪它的位置。