【发布时间】: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