我在我的應用程序中遇到了內存泄漏,並將其固定爲與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循環範圍內的所有物品被摧毀。任何人都可以在其他平臺上進行確認,或知道如何解決這個問題?
這不是一個內存泄漏,它是一個操作系統「優化」,使先前分配的內存映射到進程。如果系統空閒內存不足,內存將根據需要重新映射到另一個進程。沒什麼可擔心的。 –
@JoachimPileborg這應該是一個答案。 – nwp
@nwp我(和其他許多人)之前已經多次發佈過這樣的答案。我只是懶得找一個現在標記爲重複。 :) –