首頁>Club>
6
回覆列表
  • 1 # 使用者3082023125404

    如何檢查C++中的記憶體洩漏 記憶體洩漏是程式設計中常常見到的一個問題,我所遇過的原因有兩個:1.分配完記憶體後忘記回收2.程式碼有問題,造成想回收卻無法回收,例如:int* p=new int;p=new int; //p指標修改,原來申請記憶體的地址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏:1.包含標頭檔案和定義#define _CRTDBG_MAP_ALLOC //並非絕對需要該語句,但如果有該語句,打印出來的是檔名和行數等更加直觀的資訊#include <stdlib.h>#include <crtdbg.h>(1)#include語句必須採用上文所示順序。如果更改了順序,所使用的函式可能無法正確工作(2)如果有cpp檔案無法看到這三行,以下函式就無效了,於是應該把這三行放到一個頭檔案裡,確保每個cpp檔案會呼叫到它2.方法一:使用_CrtDumpMemoryLeaks()int main(int argc , char* argv[]){ {new int;} _CrtDumpMemoryLeaks(); return 0;}output:Detected memory leaks!Dumping objects ->{49} normal block at 0x00384DA8, 4 bytes long. Data: < > CD CD CD CD Object dump complete.其內容包括:記憶體分配型號(在大括號內)、塊型別(普通、客戶端或 CRT)、 十六進位制形式的記憶體位置、以位元組為單位的塊大小、以位元組為單位的塊大小、前 16 位元組的內容(十六進位制)注意:(1)大括號的位置,如果不加{new int;},這塊記憶體是等到main函式結束才洩漏的,而_CrtDumpMemoryLeaks()是在main函數里呼叫的,於是判斷記憶體洩漏class A{public: int* Data; A() { Data=new int; } ~A() { delete Data; }};int main(int argc , char* argv[]){ A Test; _CrtDumpMemoryLeaks(); return 0;}output:Detected memory leaks!Dumping objects ->{49} normal block at 0x00384DA8, 4 bytes long. Data: < > CD CD CD CD Object dump complete.(2)對於一些全域性函式,如果初始化時申請了記憶體,到程式結束時候才釋放,此函式會一直把新申請的記憶體當作洩漏來對待A Test;int main(int argc , char* argv[]){ _CrtDumpMemoryLeaks(); return 0;}output:Dumping objects ->{49} normal block at 0x00384DA8, 4 bytes long. Data: < > CD CD CD CD Object dump complete.2.方法二:在程式入口寫幾個語句,程式退出時,如果發現有記憶體洩漏,會自動在DEBUG OUTPUT視窗和DebugView中輸出記憶體洩漏資訊int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); tmpFlag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag( tmpFlag );3.方法三:使用_CrtMemCheckpoint(),可以查出某程式段的記憶體洩漏情況int main(int argc , char* argv[]){ CrtMemState s1, s2, s3; _CrtMemCheckpoint( &s1 ); new int; //程式段 _CrtMemCheckpoint( &s2 ); if ( _CrtMemDifference( &s3, &s1, &s2) ) _CrtMemDumpStatistics( &s3 ); return 0;}output: bytes in 0 Free Blocks.4 bytes in 1 Normal Blocks.0 bytes in 0 CRT Blocks.0 bytes in 0 Ignore Blocks.0 bytes in 0 Client Blocks.Largest number used: 0 bytes.Total allocations: 4 bytes.

  • 中秋節和大豐收的關聯?
  • 九陰真經的太極,陰柔,陽剛分別加什麼屬性好?