2011-03-20 62 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下的程序;這是一個非常有用的工具,專門用於追查這類錯誤。