2016-08-08 35 views
0

的valgrind告訴我,我已經在我的代碼如下問題:發生內存泄漏 - OpenMP的

LEAK SUMMARY: 
==18114== definitely lost: 0 bytes in 0 blocks 
==18114== indirectly lost: 0 bytes in 0 blocks 
==18114==  possibly lost: 1,776 bytes in 3 blocks 
==18114== still reachable: 2,320 bytes in 4 blocks 
==18114==   suppressed: 0 bytes in 0 blocks 

此問題:

#pragma omp parallel for num_threads(numThreads) 

parallelCalc= new Calculator[numOff]; 

    #pragma omp parallel for num_threads(numThreads) 
    for(int i = 1; i<=numOff;i++) 
    { 
     std::stringstream sstm; 
     sstm << filename <<"/" << i<<".off"; 
     std::string aktFilename = sstm.str(); 


     Polyhedron *poly = new Polyhedron(aktFilename.c_str()); 
     parallelCalc[i-1].init(poly,consistentTargets->points,numTarget); 
     parallelCalc[i-1].hfield(); 


     delete poly; 
    } 

我試着在openmp中設置parallelCalc共享(我認爲這是問題,不是嗎?)但是當我這樣做時,出現錯誤MainController::parallelCalc is not a variable in clause shared。 任何人都可以給我一個提示,如何解決這個內存問題?

+0

你有什麼理由在這裏使用指針嗎?如果沒有,則應該使用循環本地自動對象。 – NathanOliver

+0

是否確定問題與omp有關?如果您禁用omp,錯誤會消失嗎? – Mehno

+0

是的,序列版本沒有內存問題。這是相同的代碼只是沒有#pragma omp我認爲,openmp爲每個線程產生私有的並行運算,這是泄漏的問題,不是嗎? – Julian

回答

1

由於代碼不完整,我們無法重現您的錯誤。

我看到一個潛在的內存丟失。你有一個新的計算器調用,但沒有匹配的刪除。

另外,還有其他的內存可以通過間接的方式靜態分配,沒有辦法釋放。

找出問題的一種方法是在模式下使用valgrind,它將向您顯示它認爲泄漏的具體項目。我通常使用

的valgrind --verbose --num-呼叫者= 30 --track-FDS = YES --leak檢查=全--show-可達= YES

這將轉儲其它更多的信息,使你可以追蹤valgrind認爲泄漏是從哪裏來的。使用堆棧跟蹤valgrind讓你找出是否可以安全地忽略「泄漏」,因爲你無法做任何事情,或者如果你需要修復你正在編寫的代碼。

+0

請參閱以下可能的重複:http://stackoverflow.com/questions/26391389/compiling-with-openmp-results-in-a-memory-leak?rq=1 – Russ

+0

林不知道,這是一樣的。當我把parallelCalc = new parallelCalc()並在for循環中刪除parallelCalc時,我沒有得到任何泄漏,但是我需要parallelCalc的結果。 – Julian

+0

是否使用'delete [] parallelCalc'刪除parallelCalc?您是否嘗試使用上述命令行選項運行valgrind以查看valgrind指向的內容? – Russ