Detect leak memory trên Visual Studio

Leak memory được định nghĩa như việc lập trình viên quên không giải phóng (free hoặc delete) vùng nhớ đã cấp phát sau khi sử dụng xong. Một lượng nhỏ memory leak không được phát hiện ngay ban đầu. Lượng leak memory sẽ tăng dần theo thời gian. Điều này làm cho ứng dụng giảm performance, hoặc thậm chí gây chết (crash) chương trình khi sử dụng hết memory. Hoặc tệ hơn nữa, việc leak memory của 1 ứng dụng sử dụng hết vùng nhớ của các ứng dụng khác, làm cho các ứng dụng khác có thể bị crash.

Có rất nhiều cách để tìm ra leak memory trong 1 project C/C++ như review sourcecode, tools,…
Ở đây tôi sẽ giới thiệu cho các bạn 1 công cụ khá đắc lực và tin tưởng trong việc phát hiện leak memory trong project C/C++.

Trong Visual Studio 2005, 2008, 2010,.. đã tích hợp Visual Studio debugger and C Run-Time (CRT) libraries cung cấp cho bạn cách phát hiện leak memory.

Enable chức năng detect leak memory

Enable debug vùng nhớ heap,

Bạn cần phải #include các thư viện sau:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

Chú ý:
Các câu lệnh phải được giữ nguyên theo thứ tự như trên. Nếu không, việc detect leak memory sẽ không chính xác.
– Câu lệnh “#include <crtdbg.h>”, hàm malloc và free sẽ được map (ánh xạ) tới hàm _malloc_dbg và _free_dbg trong chế độ build Debug.

 

Dump thông tin của memory leak

Sau khi khai báo các câu lệnh ở mục trên, bạn có thể dump thông tin của memory leak bằng cách khai báo cậu lệnh sau vào vị trí mà chương trình chưa kết thúc.

_CrtDumpMemoryLeaks();

Khi chạy chương trình dưới debugger (Debug mode), hàm _CrtDumpMemoryLeaks() sẽ hiển thị thông tin memory leak trên cửa sổ Ouput.
Chú ý:
Phải build và chạy chương trình với Debug mode

Format của thông tin memory leak như sau:

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

 

– “C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp” là đường dẫn của file có memory leak.
– (20) là dòng thứ 20 trong source code có memory leak.
– {18} là vị trí của memory.
– Nếu bạn không sử dụng câu lệnh #define _CRTDBG_MAP_ALLOC, format của thông tin memory leak như sau:

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete

 

Goto tới dòng code cấp phát bộ nhớ

– Double click chuột vào dòng “C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}” trên Windows output
– Hoặc select dòng “C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}” trên Windows output và ấn phím F4

 

Ví dụ minh họa: Detect leak memory

Đoạn code sau minh họa việc sử dụng malloc() cấp phát bộ nhớ và không giải phóng dẫn đến leak memory.

#include "stdio.h"
#include "conio.h"

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

void main()
{
    int *pArr;
    int i;
    pArr = (int*)malloc(5 * sizeof(int));
    if (pArr)
    {
        for (i = 0; i < 5; i++)
        {
            pArr[i] = i;
        }
    }
    _CrtDumpMemoryLeaks();
    getch();
}

Kết quả:

Detect leak memory trên Visual Studio 2008
Detect leak memory trên Visual Studio 2008

Be the first to comment

Leave a Reply