2010-07-14 12 views
5

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

मैं कोड इस तरह कि घटनाओं एक ढेर पर रखा जाता है लिखा है (उपयोगकर्ता बनाया संरचना में के रूप में ढेर; घटनाओं के लिए खुद को आवंटित new उपयोग कर रहे हैं) और delete घ के बाद उनकी जानकारी पढ़ सकते हैं और उन पर कार्रवाई कर रहा है। यह मुझे कुछ समस्याएं दे रहा है क्योंकि एक मामले में, घटना तीन हैंडलरों की एक श्रृंखला के साथ भेजी जाती है। कहो, HandlerAHandlerB करने के लिए एक new Event जो इसे पढ़ता है और करता है जो कुछ भी यह प्रदर्शन करने के लिए की जरूरत है, जिसके बाद यह delete रों घटना सूचक और NULL के लिए यह सेट जो यह ढेर पर रख देता है और इसे पढ़ता है, यह HandlerC के लिए भेजने के लिए भेजता है,,। अब, हम HandlerB पर वापस आते हैं और, ठीक है, यह भी delete और NULL ईवेंट के सूचक को चाहता है। लेकिन सूचक एक स्थानीय चर है, और यह अपवाद देकर, एक ही पते को दो बार हटा देता है।

आप इसके आसपास कैसे जाते हैं? क्या आपको उन फैंसी auto_ptr एस (अभी भी शुरुआती शिक्षार्थी) में से एक का उपयोग करने की आवश्यकता है, या क्या मुझे यहां कुछ मौलिक याद आ रही है?

+0

घटनाओं को ढेर पर आवंटित किया जाता है या उन्हें ढेर पर (आवंटित) आवंटित किया जाता है और एक स्टैक डेटास्ट्रक्चर में संग्रहीत किया जाता है? – Naveen

+0

घटनाओं को ढेर पर आवंटित किया जाता है और एक ढेर संरचना में संग्रहीत किया जाता है। मुझे लगता है कि मुझे उपर्युक्त शब्द बदलना चाहिए ... –

उत्तर

10

मैं कोड इस तरह कि घटनाओं एक ढेर पर रख दिया गया और नष्ट हो जाती हैं के बाद उनकी जानकारी पढ़ सकते हैं और उन पर कार्रवाई कर रहा है लिखा है।

यहाँ कुछ भ्रम की स्थिति है - स्टैक पर वस्तुओं नहीं होना चाहिए delete डी। new (ढेर पर) के साथ बनाए गए ऑब्जेक्ट्स चाहिए।

सामान्य रूप से, आपको ढेर पर अपनी वस्तुओं के लिए एक स्पष्ट स्वामित्व रणनीति परिभाषित करनी चाहिए। प्रत्येक ऑब्जेक्ट में एक मालिक होना चाहिए, और यह स्पष्ट होना चाहिए कि मालिक किसी भी समय समय पर कौन है। वह मालिक - और यह अकेला - delete ऑब्जेक्ट होगा।

आप कच्चे पॉइंटर्स के बजाय boost::shared_ptr (यह आपके कंपाइलर के आधार पर std::tr1::shared_ptr के रूप में भी उपलब्ध हो सकता है) का उपयोग करना चाह सकते हैं। यह ऑब्जेक्ट के संदर्भों की गणना करता है, और delete एस है जब रेफ गिनती 0

+0

मेरा मतलब उपयोगकर्ता द्वारा निर्मित स्टैक संरचना पर था, जिसका मतलब आपके अर्थ में नहीं था। माफ़ कीजिये! –

+0

मुझे लगता है कि ओपी का मतलब है एक ढेर डेटा संरचना और ढेर नहीं। – Jackson

+0

@ क्रिस्टियन, मैं देखता हूं, आपकी स्पष्टीकरण के लिए धन्यवाद। फिर समस्या उतनी खराब नहीं है जितनी पहली बार लग रही थी :-) –

6

आप जो चाहते हैं वह कुछ पॉइंटर रैपर है जो उदाहरणों के लिए संदर्भ गणना का उपयोग करता है यह जांचने के लिए कि अन्य चर समान उदाहरण का संदर्भ देते हैं या नहीं। विचार यह है कि पॉइंटर पॉइंट ऑब्जेक्ट को केवल तब तक हटा दिया जाता है जब उस ऑब्जेक्ट का उपयोग किसी अन्य पॉइंटर द्वारा नहीं किया जाता है। उन प्रकार के पॉइंटर्स को आमतौर पर Smart Pointers के रूप में प्रस्तुत किया जाता है। सी ++ में आप उदाहरण के लिए Boost द्वारा प्रदान किए गए लोगों का उपयोग कर सकते हैं।

1

समस्या जैसा कि मैंने देखा है यह है कि सूचक का कोई स्पष्ट मालिक नहीं है। एक समाधान स्मार्ट पॉइंटर्स होगा जैसा कि inflagranti के जवाब में बताया गया है। वैकल्पिक रूप से आप ईवेंट को दो बार अग्रेषित करना बंद कर सकते हैं - जब एक हैंडलर (आपके उदाहरण में हैंडलर बी) को एक ऐसा ईवेंट प्राप्त होता है जिसे उसे किसी अन्य हैंडलर को अग्रेषित करने की आवश्यकता होती है, तो यह मौजूदा ईवेंट में पॉइंटर को पार करने के बजाय एक नई घटना बनाता है।

उस ने कहा; यदि आप उन्हें देखने में समय बिताने के लिए तैयार हैं, तो मुझे लगता है कि स्मार्ट पॉइंटर समाधान शायद बेहतर है!

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