程序有內存泄露,怎樣才能定位到具體泄露的語句啊?


我的一個工程很大,是用VS2005開發的,現在運行發現有內存泄露,但Output窗口輸出的泄露信息沒辦法定位到究竟哪一行語句導致泄露了,具體提示信息如下所示:

etected memory leaks!
Dumping objects ->
{1489} normal block at 0x01E40838, 172 bytes long.
 Data: <                > D0 B4 92 00 00 00 00 00 00 00 00 00 CD CD CD CD 
{1488} normal block at 0x01E407D8, 32 bytes long.
 Data: <DTV_192.168.100.> 44 54 56 5F 31 39 32 2E 31 36 38 2E 31 30 30 2E 
{1486} normal block at 0x01E406B0, 136 bytes long.
 Data: <                > F4 AF 92 00 00 00 00 00 00 00 00 00 00 00 00 00 
{1474} normal block at 0x01E40560, 1 bytes long.
 Data: < > CD 
Object dump complete.

請問,有沒有什么辦法定位到具體的泄露語句啊?

16 个解决方案

#1


leakdiag

#2


沒有別的了嗎?

#3


應該不能定義到那一句吧。。

#4


使用VS肯定不能找到具體是哪里的。。
leakdiag很好~

#5


Assists in finding memory leaks.
#define new DEBUG_NEW 
 

#6


很難呀。。。

#7


搜索分配內存的地方嘛

#8


通過new分配的內存在顯示信息時會報告出在那一個文件的那一行進行的new操作,而通過malloc分配的內存則僅僅是顯示出內存泄露的信息而無法定位分配內存的程序位置。 

此外如果需要在文件頭部定義DEBUG_NEW宏才可以正確的跟蹤new操作。具體代碼如下: 

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

由於對new操作的跟蹤只需要在調試版本中出現所以使用了條件編譯。 

我們可以看到VC所提供的檢查內存泄露的方式是非常易於使用的,我們在開發程序時一定要注意內存的分配問題,特別是對於一些長時間運行的程序。

#9


打開 調用堆棧 窗口查看

#10


我使用LeakDiag時怎么還是獲取不到泄露信息啊,我是參照
http://www.cppblog.com/sandy/archive/2008/08/18/59260.html
上面介紹的步驟執行的。
我懷疑是我的操作步驟有問題,我是這樣操作的。

1  先運行程序,在任務管理器中會出現aaa.exe進程;

2  啟動LeakDiag,選擇“Windows Heap Allocator”,然后選擇"start",過幾秒鍾選擇“log”,然后選擇“stop”,這是在C:\Leakdiag\Logs目錄下會出現一個xml文件;

3  將程序aaa.pdb文件的路徑“D:\LeadDiag\Debug\aaa.pdb”添加到“[Tools]-[Option]-Symbol search path”編輯框中;

4  然后選擇"start",過幾秒鍾選擇“log”,然后選擇“stop”,這是在C:\Leakdiag\Logs目錄下會出現另一個xml文件;

但我打開xml文件卻看不到泄露信息,是不是我的操作步驟有問題?

#11


output 只能查找到,退出沒有釋放的。很多內存會在退出時被刪除,所以輸出窗口查不出來。

使用 BoundCheck 之類的工具動態監視程序運行中類的數量。看看哪個地異常增長。

#12


通過new分配的內存在顯示信息時會報告出在那一個文件的那一行進行的new操作,而通過malloc分配的內存則僅僅是顯示出內存泄露的信息而無法定位分配內存的程序位置。  

此外如果需要在文件頭部定義DEBUG_NEW宏才可以正確的跟蹤new操作。具體代碼如下:  

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

由於對new操作的跟蹤只需要在調試版本中出現所以使用了條件編譯。  

我們可以看到VC所提供的檢查內存泄露的方式是非常易於使用的,我們在開發程序時一定要注意內存的分配問題,特別是對於一些長時間運行的程序。

#13


關注。。。

#14


打開的HANDLE要close掉,new完要delete

#15


http://www.crazyctime.com/read.php?tid=127&keyword=%E5%86%85%E5%AD%98

#16


{1486} normal block at 0x01E406B0, 136 bytes long.

你調試的時候,定位到那個地址。然后根據調用棧看看代碼。
另外vc有個語句貌似專門調試內存的(類似DebugBreak的功能)具體忘記了抱歉。

不過就是定位地址就OK。

其他的就是找找工具了。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com