5

अपने आवेदन मैं इस त्रुटि मिल रही है में:ढेर भ्रष्टाचार - "नि: शुल्क ढेर ब्लॉक 61af0f0 61af194 पर संशोधित के बाद यह मुक्त कर दिया गया था" सी ++

[email protected]() Unknown 
    [email protected]@24() Unknown 
    [email protected]() Unknown 
    [email protected]() Unknown 
    [email protected]@24() Unknown 
    [email protected]() Unknown 
> msvcr110d.dll!_heap_alloc_base(unsigned int size) Line 57 C 
    msvcr110d.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 431 C++ 
    msvcr110d.dll!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239 C++ 
    msvcr110d.dll!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine) Line 302 C++ 
    msvcr110d.dll!malloc(unsigned int nSize) Line 56 C++ 
    msvcr110d.dll!operator new(unsigned int size) Line 59 C++ 
    App.exe!std::_Allocate<char>(unsigned int _Count, char * __formal) Line 28 C++ 
    App.exe!std::allocator<char>::allocate(unsigned int _Count) Line 591 C++ 
    App.exe!std::basic_stringbuf<char,std::char_traits<char>,std::allocator<char> >::overflow(int _Meta) Line 152 C++ 
    msvcp110d.dll!std::basic_streambuf<char,std::char_traits<char> >::sputc(char _Ch) Line 196 C++ 
    msvcp110d.dll!std::ostreambuf_iterator<char,std::char_traits<char> >::operator=(char _Right) Line 634 C++ 
    msvcp110d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Put(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, const char * _Ptr, unsigned int _Count) Line 1553 C++ 
    msvcp110d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Iput(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, std::ios_base & _Iosbase, char _Fill, char * _Buf, unsigned int _Count) Line 1544 C++ 
    msvcp110d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, std::ios_base & _Iosbase, char _Fill, long _Val) Line 1216 C++ 
    msvcp110d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::put(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, std::ios_base & _Iosbase, char _Fill, long _Val) Line 1137 C++ 
    msvcp110d.dll!std::basic_ostream<char,std::char_traits<char> >::operator<<(int _Val) Line 311 C++ 
    App.exe!TUtil::intToString(int val) Line 43 C++ 
    App.exe!TFontManager::getFont(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & filename, int size) Line 15 C++ 
    App.exe!TButton::draw() Line 55 C++ 
    App.exe!TWindow::draw() Line 203 C++ 
    App.exe!TGUIManager::drawObjects() Line 49 C++ 
    App.exe!TGameAppLayer::gameCycle() Line 456 C++ 
    App.exe!TGameAppLayer::mainLoop() Line 520 C++ 
    App.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) Line 36 C++ 
    App.exe!__tmainCRTStartup() Line 528 C 
    App.exe!wWinMainCRTStartup() Line 377 C 
    [email protected]@12() Unknown 
    [email protected]() Unknown 
    [email protected]() Unknown 

:

HEAP[App.exe]: HEAP: Free Heap block 61af0f0 modified at 61af194 after it was freed 

यहाँ एक कॉल स्टैक है तो मुझे जो पता है, उससे मुझे जो त्रुटि मिल रही है वह स्मृति के ब्लॉक (फिर से हटाना) को एक्सेस कर रहा है जो पहले से ही मुक्त हो चुका था। मेरे कोड के साथ वास्तव में क्या गलत है यह जानने का प्रयास करने का यह तीसरा दिन है। इस समय के दौरान, मुझे कुछ छोटी मेमोरी लीक मिलीं जो मैंने पहले ही तय की हैं, और अब विजुअल लीक डिटेक्टर मुझे बताता है कि यह किसी भी रिसाव का पता नहीं लगाता है।

फिर भी ढेर भ्रष्टाचार के साथ समस्या बनी हुई है।

मेरे कोड के प्रत्येक स्थान पर जहां "हटाएं" ऑपरेटर का उपयोग किया जा रहा है, मैं पहले जांचता हूं कि कोई सूचक nullptr नहीं है। यदि नहीं, तो मैं इसे nullptr करने के लिए सेट:

if(m_pVar != nullptr) 
{ 
    delete m_pVar; 
    m_pVar = nullptr; 
} 

तो ऐसा लगता है वहाँ एक बार से अधिक स्मृति का एक ही ब्लॉक मुक्त कराने के साथ एक समस्या नहीं होनी चाहिए।

मैं इस कॉल स्टैक से कुछ समझने की कोशिश कर रहा था, लेकिन वह जगह है जिसमें मैं आपको मदद के लिए पूछना चाहता हूं। एक कॉल स्टैक में ऐसा लगता है कि string आवंटन के साथ समस्या है, लेकिन इसका क्या अर्थ हो सकता है? पिछले मेरी समारोह है कि कहा जाता है की जा रही है string TUtil::intToString(int val) Line 43 है, इसलिए यह है कि अगर मैं आपको लगता है कि समारोह की एक संस्था को दिखाने आसान हो सकता है:

std::string TUtil::intToString(int val) 
{ 
    std::ostringstream s; 
    s << val;     // Here's line 43 
    return s.str(); 
} 

कभी कभी फोन ढेर अलग है, तो string TUtil::intToString(int val) समारोह भी उस में मौजूद नहीं है, लेकिन यह हमेशा string एस आवंटन के साथ कुछ करने के लिए है।

मुझे आशा है कि यह स्पष्ट है कि मैंने अभी क्या कहा है। अगर आपको अधिक जानकारी चाहिए, तो कृपया मुझे बताएं और मैं इसे इस प्रश्न में संपादित कर दूंगा।

+3

चला सकते हैं क्या आप ऐसे मंच पर हैं जहां वालग्रिंड एक विकल्प है? –

+0

यदि आप लिनक्स पर काम कर रहे हैं, तो अपने आवेदन को Valgrind – Vargan

+2

के साथ जांचने का प्रयास करें क्या आपने कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर को परिभाषित किया है या उस वर्ग के उदाहरणों की स्पष्ट रूप से अस्वीकृत की है जिसमें सदस्य 'm_pVar' है? – hmjd

उत्तर

9

So from what I know, the error I'm getting is caused by accessing (deleting again) block of memory which was already freed.

जब तक आप कुछ जानते हैं और हमें नहीं बता रहे हैं, तो उपरोक्त एक लाल हेरिंग भी हो सकता है। त्रुटि भी का मतलब है कि आप एक खतरनाक सूचक के माध्यम से स्मृति को संशोधित कर रहे हैं, या बफर ओवररन के कारण।

क्या तुमने कभी संकेत की प्रतिलिपियां बनाते हैं (या तो स्पष्ट है, या प्रतिलिपि कंस्ट्रक्टर्स/असाइनमेंट ऑपरेटरों को परिभाषित करने में नाकाम रहने के द्वारा) की स्थापना m_pVar = nullptr विलोपन पर डबल हटाए खिलाफ कोई gurantees प्रदान करेगा, स्मृति त्रुटियों की अकेले अन्य प्रकार के हैं,।

यदि आपको कोड की जांच करके समस्या नहीं मिल रही है, तो आपकी सर्वश्रेष्ठ शर्त Valgrind या Purify जैसे टूल हो सकती है।

+4

एनपीई के उत्तर के लिए धन्यवाद! थोड़ी देर के उत्तर के लिए खेद है, लेकिन मैं अभी भी उन सभी संकेतों के मुताबिक समस्या ढूंढने की कोशिश कर रहा हूं जो आपने मुझे दिया था और मुझे अंत में यह "एप्लिकेशन सत्यापनकर्ता" और "डीबग डायग्नोस्टिक्स टूल" कार्यक्रमों के लिए धन्यवाद मिला। ऐसा प्रतीत होता है कि मैं स्मृति के ब्लॉक को पॉइंटर का उपयोग कर रहा हूं जो पहले से ही मुक्त हो चुका था। –

2

मॉलोक के दौरान क्रैश स्मृति भ्रष्टाचार का एक निश्चित संकेत है और यह डबल डिलीट के कारण हो सकता है या नहीं भी हो सकता है। भ्रष्टाचार आपके कोड के कुछ अलग-अलग हिस्सों में हुआ और दुर्भाग्यवश प्रभाव आपके असफल कोड में निकलता है जो निश्चित रूप से निर्दोष है। यदि संभव हो, तो अपने एप्लिकेशन को उस सिस्टम में पोर्ट करने का प्रयास करें जहां आप

+0

उत्तर के लिए अभिजीत धन्यवाद। समस्या स्मृति के ब्लॉक के लिए एक सूचक का उपयोग कर रही थी जो पहले ही मुक्त हो चुकी थी। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^