內存泄漏及其檢測方法

文章目錄


一、內存泄漏的定義
二、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);
動態內存管理(申請釋放方式不同,忘記釋放等);
內存泄露(動態內存用完後沒有釋放,又無法被其他程序使用)。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章