2013-03-27 18 views
1

是否有可用的函數可以獲取當前在堆上分配的內存塊數?它可以是Windows/Visual Studio特定的。獲取分配在堆上的塊的數量以檢測內存泄漏

我想使用它來檢查函數是否泄漏內存,而不使用專用的分析器。我想是這樣的:

int before = AllocatedBlocksCount(); 
foo(); 
if (AllocatedBlocksCount() > before) 
    printf("Memory leak!!!"); 
+0

只是運行你的代碼在一個循環,並檢查了任務管理器:P – Alon 2013-03-27 14:59:19

+0

可用於作爲替代,如果沒有這樣的功能可用,是的。但並非總是如此,有些函數不能運行循環,因爲它們從套接字等中讀取,並且服務器不會重新發送相同的數據。有時狀態會改變,並且功能不能再次以相同的方式運行。這隻能用於非常簡單的功能。 – sashoalm 2013-03-27 15:00:50

+2

@Alon在分配的堆內存和保留的OS(任務)內存之間可能存在巨大的差異。 – 2013-03-27 15:10:02

回答

2

有幾種方法可以做到這一點

的一種方法是之前使用_CrtMemCheckpoint()功能(具體以附帶Microsoft Visual Studio中CRT)。並在您感興趣的電話之後,然後將其與_CrtMemDifference()進行比較。

_CrtMemState s1, s2, s3; 

_CrtMemCheckpoint (&s1); 
foo(); // Memory allocations take place here 
_CrtMemCheckpoint (&s2); 

if (_CrtMemDifference(&s3, &s1, &s2)) // Returns true if there's a difference 
    _CrtMemDumpStatistics (&s3); 

還可以列舉使用_CrtDoForAllClientObjects()所有分配的塊,和一對夫婦的使用Visual C++ CRT的調試程序的其他方法。

注:

  • 所有這些都在<crtdbg.h>頭。
  • 他們顯然只適用於Windows和編譯VC時。
  • 您需要設置CRT調試以及一些標誌和其他內容。
  • 這些都是相當棘手的功能;請務必仔細閱讀MSDN的相關部分。
  • 在調試模式下,這些工作(即與調試CRT和定義的_DEBUG宏聯)
+1

我添加了http://msdn.microsoft.com/en-gb/library/x98tx3cf.aspx中的代碼,我希望這不是問題。 – sashoalm 2013-03-27 15:36:21

+0

@sashoalm:絕對不是!謝謝。 – yzt 2013-03-27 15:47:24