我很遗憾我无法提供更多有关我的代码的详细信息,因为我正在接管另一个项目。类结构非常复杂,我无法使用简单的示例重现该问题。
如果我删除了一个对象,那么析构函数中的所有语句都会成功执行,但是一旦析构函数完成执行,就会发生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 ++。有人知道这个问题的可能原因吗?
我再次道歉,因为无法找到产生此错误的简单示例。
答案 0 :(得分:1)
一个可能的原因是另一个对象在被删除后尝试访问p
。
更新您可以尝试通过valgrind运行代码。取决于你如何能够预先隔离问题。到目前为止,我的猜测是你在课堂上做了一些不好的事情(比如构建一个对象并将p
作为参数传递给它)。
答案 1 :(得分:0)
根据你所说的内容很难说,但听起来你有一些堆腐败。
这种问题很难追踪,而且Stack Overflow读者几乎不可能在给定大量代码库的情况下为您解决这个问题。我建议运行像valgrind这样的工具,它会跟踪内存访问并提示你出错的地方。
答案 2 :(得分:0)
我猜这次崩溃发生在operator delete(void*)
期间,在析构函数之后由delete p;
调用。
有很多可能的原因可能会导致崩溃,从而弄乱堆。一个常见的问题是某些代码先前在new
ed对象之前或之后写入内存。我会在valgrind memcheck
下运行该程序;它是一个非常有用的工具,专门用于追踪这种错误。