2009-10-14 12 views
8

Tôi đang sử dụng instructions found here để cố gắng tìm rò rỉ bộ nhớ trong ứng dụng Win32. Như đã trình bày, tôi đặtVisual Studio 2008 (C++) phát hiện rò rỉ bộ nhớ không hiển thị vị trí tệp/phương pháp - cách làm việc đó?

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

dòng ở phía trên cùng của một tập tin (file cpp có chứa WINAPI _tWinMain) và sau đó tại thời điểm xuất cảnh của WinMain tôi thêm

_CrtDumpMemoryLeaks(); 

Đáng tiếc là tôi không xem số dòng/vị trí cho các rò rỉ (nhưng tôi nhận được một danh sách các rò rỉ).

Tôi cũng đã cố gắng đưa

_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_DEBUG); 

vào đầu WinMain - và một lần nữa, không may mắn.

Tôi thấy điều này lạ vì tôi thường không gặp vấn đề gì khi phát hiện rò rỉ hoặc báo cáo tự động.

Đây là một ứng dụng cũ, rất lớn mà tôi đang làm việc cho một nhà tuyển dụng mới. Trong quá khứ tôi đã làm việc từ trình thủ thuật VS tiêu chuẩn.

Bất kỳ đề xuất nào về cách nhận các dòng/phương pháp nguồn đang gây ra rò rỉ? (Hoặc ít nhất là dòng cho "mới" gọi

EDIT

:

I also tried visual leak detector - EDIT không thành công

Rất lạ

tôi đã cố gắng sử dụng các định nghĩa lại..? của mới như được liệt kê dưới đây, tuy nhiên tôi nhận được lỗi khi tăng được biên dịch.

+0

thử dùng thử. nó sẽ giúp bạn. –

Trả lời

6

Bạn có chắc là mã đang bị rò rỉ đang sử dụng Các thói quen phân bổ gỡ lỗi CRT? Điều đó yêu cầu sử dụng malloc() hoặc new (trái ngược với LocalAlloc, GlobalAlloc, một số phân bổ khối tùy chỉnh, v.v.) và rằng _DEBUG (tôi nghĩ) phải được xác định khi các tiêu đề CRT được bao gồm.

Để nhận các đường nguồn bị rò rỉ, bạn sẽ cần xác định DEBUG_NEW ở mọi nơi phân bổ xảy ra. Điều này là do để theo dõi chúng, mỗi phân bổ phải được thay thế bằng một cuộc gọi bao gồm __FILE____LINE__. Định nghĩa tiêu chuẩn từ thuật sĩ trông giống như sau:

#ifdef _DEBUG 
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new DEBUG_NEW 
#endif 

này không xử lý malloc, có lẽ là một câu thần chú tương tự cho rằng, nếu mã bạn gỡ lỗi sử dụng malloc thay vì new.

Nếu bạn đang sử dụng tiêu đề được biên dịch trước, bạn chỉ cần đặt tiêu đề này vào tệp tiêu đề được biên dịch trước và nó sẽ ảnh hưởng đến tất cả các tệp nguồn trong dự án đó.

+0

Đúng, không sử dụng globalalloc. Điều này rất lạ với tôi. Tôi sẽ thử thêm redef mới và xem điều gì xảy ra. – Tim

+0

Tôi nghĩ rằng điều này sẽ giải quyết vấn đề của tôi, nhưng khi biên dịch các công cụ tăng cường trong dự án nó cuộn cảm. Tôi đoán tôi sẽ phải tách ra các vấn đề tăng cường bằng cách nào đó. – Tim

+6

Tôi cũng đã tham gia điều đó. Một số tăng thư viện ghi đè lên 'toán tử mới', và do đó bạn phải thực hiện định nghĩa' DEBUG_NEW' * sau * bao gồm tiêu đề tăng hoặc ít nhất một số trong số chúng. –

Các vấn đề liên quan