क्या आपको वही पॉइंटर हटा देना है जो नए द्वारा लौटाया गया था, या क्या आप कक्षाओं के आधार प्रकारों में से किसी एक को पॉइंटर पास कर सकते हैं? उदाहरण के लिए:आधार वर्ग के लिए पॉइंटर्स के साथ काम हटा देता है?
class Base
{
public:
virtual ~Base();
...
};
class IFoo
{
public:
virtual ~IFoo() {}
virtual void DoSomething() = 0;
};
class Bar : public Base, public IFoo
{
public:
virtual ~Bar();
void DoSomething();
...
};
Bar * pBar = new Bar;
IFoo * pFoo = pBar;
delete pFoo;
बेशक यह बहुत सरल है। मैं वास्तव में क्या करना चाहता हूं बूस्ट :: shared_ptr से भरा कंटेनर बनाएं और उसे कुछ कोड पर पास कर दें जो इसे समाप्त होने पर कंटेनर से निकाल देगा। यह कोड बार या बेस के कार्यान्वयन के कुछ भी नहीं जानता है, और सही चीज़ करने के लिए shared_ptr विनाशक में अंतर्निहित डिलीवरी ऑपरेटर पर भरोसा करेगा।
क्या यह संभवतः काम कर सकता है? मेरा अंतर्ज्ञान नहीं कहता है, क्योंकि पॉइंटर्स के पास एक ही पता नहीं होगा। दूसरी तरफ, एक गतिशील_कास्ट < बार *> काम करना चाहिए, इसलिए कहीं भी संकलक इसे समझने के लिए पर्याप्त जानकारी संग्रहीत कर रहा है।
सहायता के लिए धन्यवाद, हर कोई जिसने उत्तर दिया और टिप्पणी की। मेरे आभासी विनाशकों के महत्व को पहले से ही पता था, जैसा कि मेरे उदाहरण में दिखाया गया है; जवाब देखने के बाद मैंने इसे थोड़ा सा विचार दिया, और आभासी विनाशक के लिए पूरे कारण का एहसास हुआ यह सटीक परिदृश्य है। इस प्रकार इसे काम करना पड़ा। मुझे पॉइंटर को वापस मूल रूपांतरित करने के दृश्यमान साधनों की अनुपस्थिति से फेंक दिया गया था। थोड़ी और सोच ने मुझे विश्वास दिलाया कि वहां एक अदृश्य साधन थे, और मैंने सिद्धांत दिया कि विनाशक रिहाई के लिए हटाए जाने के लिए सही सूचक लौट रहा था। माइक्रोसॉफ्ट कुलपति से संकलित कोड ++ मेरी संदेह की पुष्टि की है जब मैं ~ बेस में इस लाइन को देखा जांच:
mov eax, DWORD PTR _this$[ebp]
कोडांतरक ट्रेसिंग से पता चला है कि इस सूचक हटाने कार्य करने के लिए पारित किया जा रहा था। रहस्य सुलझ गया।
मैंने आभासी विनाशक को IFoo में जोड़ने के लिए उदाहरण तय कर दिया है, यह एक साधारण निरीक्षण थी। उन सभी को धन्यवाद जिन्होंने इसे इंगित किया।
मुझे ऑब्जेक्ट को सही तरीके से नष्ट करने के लिए आभासी विनाशक के महत्व को पता है, इसलिए मैंने इसे उदाहरण में शामिल किया है; आप कह रहे हैं कि इससे उचित स्मृति मुक्त हो जाएगी? और मुझे इफू के लिए आभासी विनाशक भी चाहिए? –
असल में किसी भी संदर्भ को हटाने के लिए ठीक है जब तक कि अधिकांश वर्ग में वर्चुअल विनाशक होता है। एक बार विनाशक आभासी होने के बाद, सभी व्युत्पन्न कार्यान्वयन में एक आभासी विनाशक होगा चाहे वह निर्दिष्ट है या नहीं। सी ++ मजेदार है। – JaredPar
वर्चुअल विनाशक के बिना भी वास्तविक स्मृति को मुक्त किया जाएगा। – Eclipse