VC++內存泄漏偵測與處理
關于C++內存泄露
C與C++是開發各種高性能軟件與設備驅動軟件的必然選擇,雖然其它編程語言層出不窮,但C與C++依然處于王者地位。C與C++是最接近匯編語言的高級編程語言,其內存分配與釋放均由用戶代碼自行控制,這樣的機制讓程序員有了更廣的發揮空間,但也產生了深為詬病的內存泄漏問題,也成為很多具有內存自動回收管理機制的編程語言代替C與C++的原因。對于一般小應用程序來說,一點內存泄露不算什么。但是當內存泄漏問題出現在需要7X24小時運行的平臺類程序上的時候,將會使系統可用內存飛速減少,最后耗盡系統資源,導致系統崩潰。
不管是新手,還是有超過10年編程經驗的老手,在開發過程中發生內存泄露都是不可避免的。所以學會如何防止并檢查內存泄漏,是一個合格的c++程序員必須具備的能力。因為內存泄露在導致系統崩潰前是無任何癥兆的,從大量的代碼中要靠人工找出泄漏,無論對新人還是老手都是一場噩夢。
微軟的VC開發工具為我們檢查內存泄露提供了很好的功能,本文介紹一種在VC++中檢查內存泄漏的方法,供大家參考。
偵測內存泄露
首先在StdAfx.h中添加如下代碼,開啟程序對內存泄露的偵測,注意必須定義宏_CRTDBG_MAP_ALLOC,并包括相關頭文件。
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
在程序啟動之時調用 _CrtSetDbgFlag 告知程序在退出時報告泄露的內存。如果是應用程序,在main或WinMain函數中加入如下代碼,如果是動態鏈接庫(DLL)程序,可以在DllMain的DLL_PROCESS_ATTACH執行分支中加入如下代碼。
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
如上處理后,如果程序有內存泄漏,在程序退出時就會在VS的輸出調試窗口中輸出類似下面的內容,這樣就可以判斷出程序存在內存泄漏。
Detected memory leaks!
Dumping objects ->
{1867} normal block at 0x01E18B88, 16 bytes long.
Data: < o > A8 1C 19 00 00 00 00 00 B0 6F 18 00 CD CD CD CD
{1866} normal block at 0x01E18B28, 32 bytes long.
Data: < > 88 8B E1 01 00 00 00 00 00 00 00 00 00 00 00 00
{1865} normal block at 0x01E18AD8, 16 bytes long.
Data: < > F0 01 00 00 1E 04 00 00 BA 02 00 00 1F 04 00 00
定位內存泄露發生的代碼
在上面的_CrtSetDbgFlag 方法之后加入下面一句代碼,告訴程序在運行到發生內存泄露處的代碼時中斷。其右邊的參數就是上面報告中出現的第一個數字。
_crtBreakAlloc = 1867;
發現發生內存泄露的代碼,就可以分析自己的程序,并加入相應的釋放代碼。在內存泄露處理好之后,注釋掉上面一句代碼。經過這樣的處理,就可以把程序中的內存泄露排除得干干凈凈。
更多資源泄露說明
在Windows程序中還會用到很多多種類型的資源,如窗口句柄、文件句柄、HDC等,這些用到的資源也需要進行響應的釋放,一旦發生泄露也有可能發生災難性的后果。對這些資源進行類封裝,在C++ class的析構函數中進行釋放操作是非常好的處理方式。
銳浪報表Grid++Report源自2003年,經過多年持續不斷發展,是擁有最多軟件開發者的報表工具。易學易用,功能豐富,成熟穩定,支持各種編程環境下的報表開發。
浙公網安備 33010602011771號