成功调用析构函数或调用empy析构函数后出现段错误。 C ++

时间:2011-03-20 06:18:57

标签: c++ segmentation-fault destructor

我很遗憾我无法提供更多有关我的代码的详细信息,因为我正在接管另一个项目。类结构非常复杂,我无法使用简单的示例重现该问题。

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

我的代码如下所示:

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

“删除后”没有显示,因为之前发生了seg故障。但是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 ++。有人知道这个问题的可能原因吗?

我再次道歉,因为无法找到产生此错误的简单示例。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

根据你所说的内容很难说,但听起来你有一些堆腐败。

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

答案 2 :(得分:0)

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

有很多可能的原因可能会导致崩溃,从而弄乱堆。一个常见的问题是某些代码先前在new ed对象之前或之后写入内存。我会在valgrind memcheck下运行该程序;它是一个非常有用的工具,专门用于追踪这种错误。