2010-08-13 23 views
8

मैं विजुअल स्टूडियो में Win32 C++ एप्लिकेशन पर काम कर रहा हूं।विनाशक दुर्घटना

स्रोत फ़ाइलों में से एक में, मेरे पास वैश्विक वस्तुएं नीचे दी गई हैं।

TestClass tObj; 

int main() //Execution starts here 
{ 
} 

टेस्टक्लास को अन्य डीएलएल में नीचे जैसा परिभाषित किया गया है।

struct Source 
{ 

}; 

class TestClass 
{ 
    list<Source> sourceList; 
    public: 
     TestClass() {} 
     ~TestClass() {} 
}; 

अपने आवेदन चल रहा है, अगर मैं कंसोल विंडो बंद करके स्पष्ट रूप से ऐप्स को बंद करने, कोशिश, यह TestClass नाशक में क्रैश हो रहा है। कॉलस्टैक दिखाता है CrtIsValidHeapPointer विफल हो रहा है।

Pls इस समस्या को हल करने में मेरी सहायता करें।

+0

इंडेंट कोड में चार रिक्त स्थान का उपयोग करें और सामान्य टेक्स्ट के लिए कोई भी नहीं। –

+1

क्या आपने एक्सई और डीएलएल को उसी सी ++ रनटाइम के साथ बनाया है? – Mark

+0

हां मैंने विजुअल स्टूडियो के साथ दोनों का निर्माण किया। केवल विन्यास प्रकार अलग है। एक exe है और अन्य परियोजना सेटिंग्स में डीएलएल विन्यास है। – bjskishore123

उत्तर

4

सुनिश्चित करें कि आप एक ही रनटाइम के साथ EXE और DLL को बॉट बनाएं, अधिमानतः गतिशील रनटाइम के साथ।

+0

क्रैश को एक्सई और डीएल में समान रनटाइम लाइब्रेरी का उपयोग करके हल किया जाता है। मेरी मदद करने के लिए सभी को धन्यवाद। इस व्यापक उत्तर के लिए – bjskishore123

1

यह विनाशक में दुर्घटनाग्रस्त हो रहा है, विनाशक से अपवाद को फेंक दिया जा रहा है जो आपके आवेदन को समाप्त और क्रैश कर रहा है। Uncaught exceptions

ऐसी दो स्थितियां हैं जिनमें एक विनाशक कहा जाता है। पहला तब होता है जब एक वस्तु "सामान्य" स्थितियों के तहत नष्ट हो जाती है, उदाहरण के लिए, जब यह दायरे से बाहर हो जाती है या स्पष्ट रूप से हटा दी जाती है। दूसरी बात यह है कि अपवाद प्रसार के ढेर-अनचाहे हिस्से के दौरान अपवाद-हैंडलिंग तंत्र द्वारा ऑब्जेक्ट को नष्ट किया जाता है। आप एक अपवाद के कारण रूढ़िवादी धारणा है कि एक अपवाद सक्रिय है, क्योंकि अगर नियंत्रण एक नाशक छोड़ देता है के तहत अपने विनाशकर्ता लिखना चाहिए, जबकि एक अन्य अपवाद सक्रिय है, सी ++ समारोह समाप्त

+0

मुख्य वस्तु() को कॉल करने से पहले वैश्विक वस्तु का निर्माण हो रहा है। तो मुझे लगता है कि इसका विनाश मुख्य() बाहर निकलने के बाद हो रहा है। उस समय, सूची स्रोत सूची जो एसटीएल आंतरिक रूप से उपयोग करती है, मुक्त होने के समय मान्य नहीं है। इसलिए CrtIsValidHeapPointer विफल रहा है। – bjskishore123

+0

सवाल यह है: स्रोत सूची प्रमुख क्यों अमान्य है? यदि आपका एक्सई और डीएलएल संगत रनटाइम के साथ सही ढंग से बनाया गया है, तो इस कोड को ठीक काम करना चाहिए। ढेर मुक्त होने से पहले रनटाइम वैश्विक वस्तुओं को साफ कर देगा। –

+0

क्रैश को एक्सई और डीएल में समान रनटाइम लाइब्रेरी का उपयोग करके हल किया जाता है। मेरी मदद करने के लिए सभी को धन्यवाद। – bjskishore123

1

वैश्विक वस्तुओं initialised और द्वारा नष्ट कर रहे हैं कॉल सी रनटाइम। उन्हें main से पहले शुरू किया जाता है, इसे लौटने के बाद बुलाया जाता है और नष्ट कर दिया जाता है।

त्रुटि शायद आपके विनाशक (या अप्रत्यक्ष रूप से Source विनाशक से) तक पहुंचने वाली किसी चीज़ के कारण हुई है। विनाशक कोड अमान्य स्मृति तक पहुंच रहा है (या स्मृति जो पहले से ही मुक्त हो चुकी है)।

वैश्विक चर के प्रारंभिकरण और विनाश का आदेश परिभाषित नहीं किया गया है, और अक्सर आवेदन समाप्ति पर त्रुटियों का स्रोत होता है। यदि ऐसे अन्य ग्लोबल्स हैं जो टेस्ट क्लास द्वारा संदर्भित संसाधनों को साफ़ या संशोधित कर सकते हैं, तो यह अपराधी हो सकता है।

+0

मैं स्रोत सूची में कोई नोड नहीं जोड़ रहा हूं (सूची )। विनाशक कॉल के समय सूची खाली है। लेकिन फिर भी, एसटीएल सूची में आंतरिक रूप से एक छुपा हेड पॉइंटर होगा। इसे मुक्त करने की कोशिश करते समय, यह दुर्घटनाग्रस्त हो गया। – bjskishore123

+0

कौन सी सीआरटी आप EXE और DLL के विरुद्ध बना रहे हैं? –

0

क्या डीएलएल और EXE एक ही संरेखण (पैक प्रागमा) का उपयोग कर बनाया गया है?

9

आपका समस्या यह है कि .exe के बीच संकलक/लिंकर सेटिंग्स भिन्न और .dll प्रभावी रूप से .dll उत्पन्न कर रहे हैं और .exe मानक पुस्तकालय के विभिन्न कार्यान्वयन का उपयोग किया जा सकता है:

  • आप एक ही उपयोग करना चाहिए preprocessor झंडे * .exe और .dll दोनों बनाने के लिए, अन्यथा प्रत्येक बाइनरी संक्षेप में विभिन्न कार्यान्वयन के साथ संकलित करेगा।
  • आपको गतिशील रनटाइम दोनों .exe और .dll दोनों को लिंक करना होगा। रनटाइम से स्थिर रूप से जुड़े द्विआधारी अपने ही ढेर प्राप्त करते हैं - और आप एक ढेर पर आवंटित होते हैं और दूसरे पर मुक्त करने की कोशिश करते हैं।

इसे ठीक, Project > Properties > Configuration Properties > C/C++ > Code Generation के पास जाकर Multi-threaded Debug DLL (/MDd) के क्रम पुस्तकालय विकल्प बदलने के लिए। आपको यह .exe प्रोजेक्ट और .dll प्रोजेक्ट दोनों के लिए करना होगा।

विजुअल स्टूडियो 2010 के रूप में, इनमें से कुछ त्रुटियों को #pragma detect_mismatch का उपयोग करके लिंक समय पर पता लगाया जाएगा।

* सब पूर्वप्रक्रमक झंडे मानक पुस्तकालय कार्यान्वयन

+0

'+ 1' मुझसे। @ bjskishore123: कृपया [एफएक्यू] (http://stackoverflow.com/faq) पढ़ें। आपको उस उत्तर को स्वीकार करने के लिए प्रोत्साहित किया जाता है जिसे आप अपनी समस्या का समाधान करने में सबसे अधिक मदद करते हैं। – sbi

0

कोशिश की कोई असर अपने निर्माता और नाशक गैर इनलाइन, यह मदद मिल सकती है करना है के लिए। यदि सीटीओआर और डाटर इनलाइन नहीं हैं, तो दोनों डीएल की ओर से उत्पन्न किए जाएंगे, इसलिए सूची <> का निर्माण और विनाश उसी रनटाइम लाइब्रेरी के साथ निष्पादित किया जाएगा। आम तौर पर, डीएलएल सीमाओं में ओपेक एसएलएल objcts गुजरने से बचने की कोशिश करें। निजीकरण सदस्यों को अपने स्वयं के वर्गों में शामिल करना बेहतर है और ऐसे सदस्यों को कुशल बनाने के लिए गैर-इनलाइन विधियों को प्रदान करना

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