日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Visual Studio中检测内存泄漏的方法(一)

發(fā)布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Visual Studio中检测内存泄漏的方法(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

有些內(nèi)存泄露是不會dump出來詳細信息的,只會給出內(nèi)存塊號,這種情況一下一般可以用一下方法調(diào)試出來。

??這兩天調(diào)一個程序,發(fā)現(xiàn)每次退出都有內(nèi)存泄漏,在此總結(jié)一個調(diào)試內(nèi)存泄漏的好方法。

????對于比較明顯的內(nèi)存泄漏,vc2008是比較容易定位的,在Debug模式F5運行,退出時會列出引起內(nèi)存泄漏的問題代碼所在文件及行號;但如果是比較隱蔽的內(nèi)存泄漏,Output輸出窗口只會輸出部分信息,形式如下:

????Detected memory leaks!
????Dumping objects ->
????{858} normal block at 0x003ED290, 12 bytes long.
????Data: < \H?????????> A0 5C 48 00 00 00 00 00 00 00 00 00
????Object dump complete.

????我們來看一下輸出信息的格式。

????{xxx} — 表示程序運行后第xxx次內(nèi)存分配發(fā)生了泄漏,即內(nèi)存分配編號;

????xxx block — 表示內(nèi)存塊類型,包括三種:普通(normal)、客戶端(client)和運行時(CRT);

????at 0xFFFFFFFF — 表示發(fā)生泄漏的內(nèi)存地址,用十六進制表示;

????xx bytes long — 表示發(fā)生泄漏的內(nèi)存大小;

????Data:xxx — 表示內(nèi)存數(shù)據(jù)信息,一般輸出前16字節(jié)的內(nèi)容。

????內(nèi)存泄漏的地址、大小和數(shù)據(jù)信息很難對我們的定位起到有效地幫助,但是如果我們能夠讓程序停在分配有泄漏的內(nèi)存的地方,然后根據(jù)調(diào)用堆棧(Call Stack)里的信息,就可以很方便的定位是哪個語句出現(xiàn)問題。幸運的是,VC的C運行庫(C run-time library)為我們提供了一個這樣的函數(shù):CrtSetBreakAlloc,聲明如下:?

long?_CrtSetBreakAlloc(?long?lBreakAlloc?);

????其中參數(shù)lBreakAlloc即為內(nèi)存分配號(花括號中的數(shù)字)。我們只要在程序初始化函數(shù)中添加語句:_CrtSetBreakAlloc(858)就可以使程序在Debug F5運行時自動斷點到我們想要的位置。

????使用這個函數(shù)進行內(nèi)存泄漏定位有個條件,即發(fā)生內(nèi)存泄漏的分配號是固定的,每次啟動程序不會隨機變化。?

????但是如果我們的程序比較大,內(nèi)存泄漏也不止一個,用上面的方法調(diào)試可能會很麻煩,需要經(jīng)常更新代碼并重新編譯程序。還有更好的方法。

?

????首先確定自己的程序使用的是哪個C運行庫,方法是程序Propertise -> C/C++ -> Code Generation -> Runtime Library選項,若為Multi-threaded Debug(/MTd),則為靜態(tài)鏈接,若為Multi-threaded Debug DLL(/MDd),則為動態(tài)鏈接。

????然后按F11啟動程序,程序會停在入口點。此時調(diào)出Watch窗口,

????靜態(tài)鏈接?在name項中輸入_crtBreakAlloc,在value項中輸入你要定位的內(nèi)存分配編號;

????動態(tài)鏈接?在name項中輸入{,,msvcr90d.dll}_crtBreakAlloc,在value項中輸入內(nèi)存分配號。注意msvcr90d.dll是vc2008環(huán)境使用的運行庫dll,若你用的是其他版本vc,請換成對應(yīng)版本的dll。

????現(xiàn)在按F5運行,程序就會自動定位到你要調(diào)試的內(nèi)存分配語句,這時候看call stack的信息會很有幫助。

????這個辦法使用起來非常靈活,只要你確定內(nèi)存分配號是不變的,就可以方便地為程序設(shè)置斷點了,省去了更新代碼和編譯的麻煩。這個方法幾乎是當(dāng)前進行內(nèi)存泄漏調(diào)試的最有效方法,如果你發(fā)現(xiàn)內(nèi)存泄漏的分配號是變化的,可以想辦法去掉一些沒有問題的內(nèi)存申請(多半是界面和多線程涉及到的申請),盡量使有問題的分配固定,就可以用這個方法排錯了。

http://blog.sina.com.cn/s/blog_48f93b530100hnls.html

http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q151/5/85.asp&NoWebContent=1

另外兩個不錯的參考:

https://blog.csdn.net/sinat_20265495/article/details/51763084

https://blog.jianchihu.net/visual-studio-memory-leak.html

總結(jié)

以上是生活随笔為你收集整理的Visual Studio中检测内存泄漏的方法(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。