2014-03-13 24 views
3

上VS 2012使用下面的代碼,本地C++開發:PROCESS_MEMORY_COUNTERS_EX創建不可靠的PrivateUsage字段,爲什麼?

SIZE_T CppUnitTests_MemoryValidation::TakeMemoryUsageSnapshot() { 
    PROCESS_MEMORY_COUNTERS_EX processMemoryCounter; 
    GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) 
     &processMemoryCounter, sizeof(processMemoryCounter)); 
    return processMemoryCounter.PrivateUsage; 
} 

我前後各CPPUnitTest後調用此方法,並計算PrivateUsage場的差。通常這種差異應該是零,假設我的內存分配不泄漏。

只有簡單的事情發生在我的測試類內。即使沒有任何內存分配,只是創建一個我的測試類的實例並再次釋放它,有時(不是在每次測試迭代中)差異都會達到零以上,所以這個方案似乎是非確定性的。

有沒有人比我更有見識,可以解釋如何解決這個問題或告訴我我的假設有什麼問題?

+1

PrivateUsage包含已發佈的堆塊,現在位於空閒塊列表中,可以重新使用。改爲使用[調試分配器](http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.90%29.aspx)。 –

回答

0

總之,你的假設是不正確的。執行內存分配(the Event Tracing thread和其他任何由您的系統上的第三方附加組件創建的內容)可能會有很多其他事情發生,因此偶爾會發現內存使用情況並不奇怪。

0

在Hans Passants調試分配器鏈接後,我注意到有關Microsoft的內存泄漏檢測工具的更多信息,特別是_CrtMemCheckpoint函數。

我跟着鏈接把我的內存快照時,使用此功能,並檢查使用_CrtMemDifference功能差爲「http://msdn.microsoft.com/en-us/library/5tz9b54s(v=vs.90).aspx

現在,這似乎工作可靠和確定性。

相關問題