2014-05-23 258 views
1

我在我的應用程序中遇到了內存泄漏,並將其固定爲與vtk相關的 。我在Windows 7上使用vtk 6.1.0和Visual Studio 2012,全部使用64位。vtk使用越來越多的內存並變得緩慢。

我用vtk的更多算法遇到了這種行爲。 它並不是與內存有關的操作系統,而是vtk。似乎每次調用update時,vtk都會創建對象並將它們放入一個更新隊列中,並最終不會刪除。考慮以下代碼:

#include <vtkImageConstantPad.h> 
#include <vtkImageData.h> 
#include <ctime> 

int main(int argc, char *argv[]) 
{ 
    int c=0; 
    clock_t start; 
    size_t iterations = 1000; 
    while (c != '.'){ 
     c = getchar(); 
     start = clock(); 
     for(size_t i=0; i<iterations; ++i){ 
      vtkImageConstantPad* pad = vtkImageConstantPad::New(); 
      vtkImageData* test = vtkImageData::New(); 
      test->SetExtent(0,1,0,1,0,1); 
      test->AllocateScalars(VTK_FLOAT,1); 
      pad->SetInputData(test); 
      pad->SetOutputWholeExtent(0,2,0,2,0,2); 
      pad->Update(); //this is what makes it bad 
      pad->Delete(); 
      test->Delete(); 
     } 
     std::cout << "Time for " << iterations << ": " << static_cast<double>(clock() - start)/CLOCKS_PER_SEC << "sec" << std::endl; 
    } 
    return 0; 
} 

輸出對我來說是:

Time for 1000: 0.816sec 
Time for 1000: 1.879sec 
Time for 1000: 3.454sec 
etc. 

因此它消耗更多的內存和更多的時間每次調用update(),雖然在for循環範圍內的所有物品被摧毀。任何人都可以在其他平臺上進行確認,或知道如何解決這個問題?

+0

這不是一個內存泄漏,它是一個操作系統「優化」,使先前分配的內存映射到進程。如果系統空閒內存不足,內存將根據需要重新映射到另一個進程。沒什麼可擔心的。 –

+0

@JoachimPileborg這應該是一個答案。 – nwp

+0

@nwp我(和其他許多人)之前已經多次發佈過這樣的答案。我只是懶得找一個現在標記爲重複。 :) –

回答

1

經過進一步調查後,我發現這個問題並沒有出現在所有機器上。 最後我發現我的Bitdefender Antivirus不知何故搞亂了這個程序,並導致了這種奇怪的行爲。當我關閉它時,一切都按預期工作。

+1

嘿,同樣對我來說,我也有位防守者,可以重現問題以及解決方案。 – choosyg