Contents
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ả:
Leave a Reply
You must be logged in to post a comment.