2012-11-14 18 views
5

मुझे मेमोरी लीक के साथ एक बहुत ही अजीब समस्या है। मैं लीक की जांच के लिए _CrtDumpMemoryLeaks का उपयोग करता हूं।अजीब "मेमोरी लीक डिटेक्शन" त्रुटि सी ++

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; 
} 

आप देख सकते हैं, मैं अगर शायद मैं झूठे अलार्म किसी तरह मिल यह सिर्फ जांच करने के लिए पूरी तरह से सब कुछ से निकाल दिया है: यहाँ मेरी WinMain कार्य है।

मैं एक आवेदन बंद करने के बाद, मैं उत्पादन में मेमोरी लीक के इस गुच्छा मिलता है:

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. 

मैं पूरी तरह से पता नहीं है, जहां उन्हें कहाँ से आती हैं की है।

किसी भी उत्तर के लिए अग्रिम धन्यवाद।

उत्तर

4

आउटपुट विंडो की जांच करें। क्या आप डीएलएल लोड होने का एक गुच्छा देखते हैं? उनमें से कोई भी स्थैतिक रूप से उन डेटा संरचनाओं को प्रारंभ कर सकता है जो रिसाव आउटपुट को कॉल करने से पहले मुक्त नहीं होते हैं। उस शोर में से कुछ को बाहर निकालने के लिए टिप here को ट्रिगर करें, निष्पादन समय की एक निश्चित सीमा तक अपनी रिसाव जांच को ब्रैकेट करके।

चूंकि स्थैतिक रूप से प्रारंभिक Google टेस्ट सिंगलटन को ढेर पर आवंटन की आवश्यकता होती है, तो दृश्य सी ++ मेमोरी लीक डिटेक्टर प्रोग्राम चलाने के अंत में मेमोरी लीक की रिपोर्ट करेगा। इससे बचने का सबसे आसान तरीका _CrtMemCheckpoint और _CrtMemDumpAllObjectsSince का उपयोग किसी भी स्थैतिक प्रारंभिक ढेर ऑब्जेक्ट्स की रिपोर्ट न करने के लिए करता है। अधिक जानकारी और अतिरिक्त ढेर चेक/डीबग दिनचर्या के लिए एमएसडीएन देखें।

+0

उत्तर के लिए धन्यवाद, स्टीव! :-) –

+0

आपका स्वागत है, मुझे नहीं पता था कि आप इस तरह की खिड़की पर कब्जा कर सकते हैं जब तक कि मुझे आपके क्यू के बारे में सोचना नहीं था –