2011-03-20 58 views
0

非常抱歉,我无法提供我的代码的更多细节,因为我正在接管另一个项目。类结构非常复杂,我无法用简单的例子来重现问题。成功调用析构函数或调用empy析构函数后出现Seg错误。 C++

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

我的代码如下所示:

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

没有显示,由于赛格故障之前发生的“删除后”。但p的析构函数已成功执行。

将帖子一些意见后]的“合成()”方法不使用多线程,但它是非常简单的:

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);; 
} 

这几乎所有的合成()方法,所以我不知道认为多线程会导致任何问题。

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

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

+0

它有任何基类吗? – GManNickG 2011-03-20 06:21:50

+0

@GMan:不,完全没有。 – CodeNoob 2011-03-20 06:22:31

+0

那么在析构函数之后运行什么呢? – GManNickG 2011-03-20 06:25:07

回答

1

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

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

+0

克里斯,感谢您的评论,我在原始文章中添加了一些细节以清除某些内容。 – CodeNoob 2011-03-20 06:35:20

0

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

这种问题很难跟踪,而且堆栈溢出读取程序几乎不可能为给定的代码库修复此问题。我建议运行一个像valgrind这样的工具,它会跟踪内存访问并给出提示错误出现的地方。

0

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

有很多可能的原因,以可能导致崩溃的方式搞乱堆。常见的一种情况是,某些代码先前或之后在写入内存时写入了内存。我将运行valgrind memcheck下的程序;这是一个非常有用的工具,专门用于追查这类错误。