【问题标题】:Crash before main()main() 之前崩溃
【发布时间】:2013-08-08 01:45:51
【问题描述】:

我的程序在 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)。

附:我读过Is there any way a C/C++ program can crash before main()?,但看看gdb 按摩我想图书馆还可以。

【问题讨论】:

  • 您不需要if(x) 检查。它没有添加任何东西。您正在删除未使用 new 分配的内容。
  • juanchopanza,好主意,谢谢。但是为什么 if(x) 什么都不做呢?指针用 0 初始化。
  • 因为在空指针上调用 delete 是无操作的。
  • 另外,请使用nullptr

标签: c++ memory-management crash


【解决方案1】:

cout 不是检查程序崩溃位置的好方法,因为cout 不会立即刷新其缓冲区,并且您的程序可能在cout 之后但在刷新缓冲区之前崩溃。最好用cerr而不是cout检查它

在main函数之前,会调用全局变量的构造函数。因此,如果您认为它在开始前崩溃,请查看它们。

另一种可能性是在调用主函数之前为主函数中的数组分配内存。如果它们很大。您必须使用new 为它们分配内存。

【讨论】:

  • 我已将 bout 更改为 cerr(效果相同)。谢谢。我正在研究构造函数,但找不到任何可疑的东西。而且我没有全局数组。
  • 主函数中的任何大的本地数组都可能导致此类问题。主函数或全局对象中有大数组吗?
  • 看起来错误消息说它是在为 std::string 分配内存时发生的,其中确实包含一个数组。
  • 您是否在全局变量的构造函数中使用 cerr 来检测此异常发生的位置?是在构建全局对象之前吗?
【解决方案2】:

std::basic_stringbuf&lt;char, std::char_traits&lt;char&gt;... 告诉我是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 在堆栈上。如果它总是相同的值,您可以尝试追踪它的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2011-09-08
    • 2011-01-31
    • 2012-05-25
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多