2012-11-14 32 views
5

Tôi có một vấn đề rất lạ với rò rỉ bộ nhớ. Tôi sử dụng _CrtDumpMemoryLeaks để kiểm tra rò rỉ. Đây là chức năng WinMain tôi:Lỗi "Phát hiện rò rỉ bộ nhớ" lạ C++

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, 
        _In_opt_ HINSTANCE hPrevInstance, 
        _In_ LPTSTR lpCmdLine, 
        _In_ int  nCmdShow) 
{ 
    UNREFERENCED_PARAMETER(hPrevInstance); 
    UNREFERENCED_PARAMETER(lpCmdLine); 

    ////////////////// SET UP CHECKS FOR MEMORY LEAKS //////////////////// 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    ////////////////////////////////////////////////////////////////////// 


    _CrtDumpMemoryLeaks(); // Reports leaks to stderr 

    return 0; 
} 

Như bạn thấy, tôi đã loại bỏ hoàn toàn tất cả mọi thứ từ nó chỉ để kiểm tra xem có lẽ tôi nhận được một số loại báo động sai.

Sau khi tôi đóng một ứng dụng, tôi nhận được bó này rò rỉ bộ nhớ trong đầu ra:

Detected memory leaks! 
Dumping objects -> 
{1343} normal block at 0x06076780, 8 bytes long. 
Data: < g  > 20 67 07 06 00 00 00 00 
{1342} normal block at 0x06076710, 52 bytes long. 
Data: <@ @ @  > 40 16 07 06 40 16 07 06 40 16 07 06 01 00 CD CD 
{1341} normal block at 0x060766B0, 32 bytes long. 
Data: <C:/Windows/Fonts> 43 3A 2F 57 69 6E 64 6F 77 73 2F 46 6F 6E 74 73 
{1339} normal block at 0x0607F438, 16 bytes long. 
Data: <    P > C0 17 0B 01 01 00 00 00 01 00 00 00 80 13 50 04 
{1338} normal block at 0x04501380, 8 bytes long. 
Data: < H > BC 0D 0B 01 48 18 07 06 
{1295} normal block at 0x060716B0, 8 bytes long. 
Data: <  > B4 B3 0B 01 00 00 00 00 
{1294} normal block at 0x06071640, 52 bytes long. 
Data: < g g g  > 10 67 07 06 10 67 07 06 10 67 07 06 01 01 CD CD 
{1293} normal block at 0x0450DFB8, 8 bytes long. 
Data: < ! P > E0 21 0B 01 98 05 50 04 
{1292} normal block at 0x0450E110, 8 bytes long. 
Data: < P  > E8 05 50 04 00 00 00 00 
// (There's like thousand more of those...) 
Object dump complete. 

tôi có hoàn toàn không có ý tưởng nơi nào họ đến từ.

Cảm ơn trước vì bất kỳ câu trả lời nào.

Trả lời

4

Kiểm tra cửa sổ Đầu ra. Bạn có thấy một loạt các DLL đang được tải không? Bất kỳ người trong số họ có thể được khởi tạo tĩnh cấu trúc dữ liệu mà không được giải phóng trước khi bạn gọi đầu ra rò rỉ. Hãy thử mẹo here để loại trừ một số tiếng ồn đó, bằng cách đánh dấu kiểm tra rò rỉ của bạn với một khoảng thời gian thực hiện nhất định.

Vì bản thử nghiệm Google được khởi tạo tĩnh yêu cầu phân bổ trên heap, bộ dò rò rỉ bộ nhớ Visual C++ sẽ báo cáo rò rỉ bộ nhớ ở cuối chương trình. Cách dễ nhất để tránh điều này là sử dụng _CrtMemCheckpoint và _CrtMemDumpAllObjectsSince cuộc gọi để không báo cáo bất kỳ đối tượng heap được khởi tạo tĩnh nào. Xem MSDN để biết thêm chi tiết và bổ sung kiểm tra đống/gỡ lỗi thói quen.

+0

Cảm ơn câu trả lời, Steve! :-) –

+0

Bạn được chào đón, tôi không biết bạn có thể chụp một cửa sổ thời gian như thế này cho đến khi tôi phải suy nghĩ về q của bạn –