【问题标题】:Seg fault after calling destructor successfully or calling empy destructor. C++成功调用析构函数或调用 empy 析构函数后的 Seg 错误。 C++
【发布时间】:2011-07-19 00:49:27
【问题描述】:

非常抱歉,由于我正在接手另一个项目,因此无法提供代码的更多详细信息。类结构非常复杂,我无法使用简单的示例重现该问题。

基本上,如果我删除一个对象,析构函数中的所有语句都已成功执行,但是一旦析构函数完成执行,就会发生段错误。即使我只是让析构函数为空而不做任何事情,段错误仍然会发生。这个类没有任何基类。

我的代码如下所示:

ParallelSynthesizer* p = new ParallelSynthesizer(argc, argv);
p->synthesize();
delete p;
cout << "after deleting" << endl; 

“删除后”没有显示,因为段错误发生在此之前。但是 p 的析构函数执行成功。

[在一些评论后编辑]“synthesize()”方法确实使用了多线程,但它非常简单:

pthread_t threads[num_threads];
// makes the "params" array here. skipped. 
for (int i=0; i<num_threads; i++) {
    pthread_create(&threads[i], NULL, synthesizeThreadMethod, (void*)(params[i]));
}

for (int i=0; i<num_threads; i++) {
    pthread_join(threads[i], NULL);;
}

这几乎都在 synthesize() 方法中,所以我认为多线程不会导致任何问题。

我在 linux 上使用 g++。有人知道这个问题的可能原因吗?

对于无法找到产生此错误的简单示例再次道歉。

【问题讨论】:

  • 它有基类吗?
  • 那么在析构函数之后运行的是什么?
  • @GMan:没什么。我只是在“delete p;”之后添加了一个输出语句段错误发生在输出语句执行之前。但是析构函数执行成功,通过析构函数中的输出语句验证。
  • 你没有重载 std::new ,对吧?
  • @usfish:这是声明,而不是定义。构造函数的实现就是它的定义。

标签: c++ segmentation-fault destructor


【解决方案1】:

一个可能的原因是另一个对象在被删除后尝试访问p

更新您可以尝试通过 valgrind 运行您的代码。取决于您事先隔离问题的能力。到目前为止,我的猜测是你在类中做了一些坏事(比如构造一个对象并将p 作为参数传递给它)。

【讨论】:

  • 克里斯,感谢您的评论,我在原始帖子中添加了更多细节以澄清一些事情。
【解决方案2】:

根据你所说的很难说,但听起来你有一些堆损坏。

这类问题很难追踪,而且 Stack Overflow 的读者几乎不可能在代码库很大的情况下为您解决这个问题。我建议运行像 valgrind 这样的工具,它会跟踪内存访问并提示您哪里出了问题。

【讨论】:

    【解决方案3】:

    我猜想崩溃发生在operator delete(void*) 期间,由delete p; 在析构函数之后调用。

    以一种可能导致崩溃的方式弄乱堆的可能原因有很多。一个常见的情况是,一些代码以前在 new-ed 对象之前或之后写入内存。我会在valgrind memcheck 下运行程序;这是一个非常有用的工具,专门用于追踪此类错误。

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 2013-07-10
      • 2014-05-03
      • 1970-01-01
      • 2017-04-28
      • 2011-04-16
      • 2013-04-17
      • 2015-10-07
      相关资源
      最近更新 更多