文章目錄
一、內存泄漏的定義
二、VS下內存泄漏的檢測方法(CRT)
三、Linux系統下內存泄漏的檢測方法(valgrind)
一、內存泄漏的定義
內存泄漏指的是在程序裏動態申請的內存在使用完後,沒有進行釋放,導致這部分內存沒有被系統回收,久而久之,可能導致程序內存不斷增大,系統內存不足……引發一系列災難性後果。
二、VS下內存泄漏的檢測方法(CRT)
#define CRTDBG_MAP_ALLOC //放在程序最前
#include <iostream>
#include <stdlib.h>
#include <crtdbg.h>
using namespace std;
int main()
{
int *a = new int [10];
int *p = new int[1000];
_CrtDumpMemoryLeaks(); //放在程序最後
system("pause");
return 0;
}
程序運行後在【即時窗口】中可以看到內存泄漏的信息:
{65}和{66}代表了第65、66次內存分配操作發生了泄漏,所以根據這兩個信息,可以定位到內存泄漏的位置,可以添加如下代碼:
#define CRTDBG_MAP_ALLOC
#include <iostream>
#include <stdlib.h>
#include <crtdbg.h>
using namespace std;
int main()
{
_CrtSetBreakAlloc(65);
//_CrtSetBreakAlloc(66); //分別取消註釋即可觸發所有斷點。
int *a = new int [10];
int *p = new int[1000];
_CrtDumpMemoryLeaks();
system("pause");
return 0;
}
運行時,程序會自動觸發斷點到內存泄漏的位置。
三、Linux系統下內存泄漏的檢測方法(valgrind)
編譯:g++ -g -o test test.cpp
使用:valgrind --tool=memcheck ./test
可以檢測如下問題:
使用未初始化的內存(全局/靜態變量初始化爲0,局部變量/動態申請初始化爲隨機值);
內存讀寫越界;
內存覆蓋(strcpy/strcat/memcpy);
動態內存管理(申請釋放方式不同,忘記釋放等);
內存泄露(動態內存用完後沒有釋放,又無法被其他程序使用)。