यह एक पुराना, उत्तर दिया गया, प्रश्न है, लेकिन @Alexandre ने पूछा "कोई भी ऐसा क्यों करना चाहेगा?"
लीगेसी कोड। नग्न बिंदुओं का उपयोग करता है Obj * अंत में हटाए गए obj के साथ obj।
दुर्भाग्य से मुझे कभी-कभी ज़रूरत होती है, अक्सर वस्तु को लंबे समय तक जीवित रखने के लिए नहीं।
मैं इसे एक संदर्भ स्मार्ट पॉइंटर गिने जाने पर विचार कर रहा हूं। लेकिन बहुत सारे कोड बदलने होंगे, अगर मुझे ref_cnt_ptr<Obj>
हर जगह इस्तेमाल करना था । और यदि आप नग्न ओब्ज * और रेफ_cnt_ptr मिलाते हैं, तो आप ऑब्जेक्ट को स्पष्ट रूप से हटा सकते हैं जब अंतिम Ref_cnt_ptr चला जाता है, भले ही ओब्ज * अभी भी जीवित हैं।
इसलिए मैं एक clear_delete_ref_cnt_ptr बनाने के बारे में सोच रहा हूं। यानी एक रेफरेंस काउंटेड पॉइंटर जहां डिलीट केवल स्पष्ट डिलीट रूटीन में किया जाता है। एक जगह पर इसका उपयोग करने से जहां मौजूदा कोड ऑब्जेक्ट के जीवनकाल को जानता है, साथ ही साथ मेरे नए कोड में जो ऑब्जेक्ट को लंबे समय तक जीवित रखता है।
स्पष्ट गणना के रूप में संदर्भ संख्या को बढ़ाते और घटाते हुए जोड़ तोड़ हो जाते हैं।
लेकिन जब संदर्भ गणना स्पष्ट रूप से स्पष्ट नहीं देखी जाती है, तो खाली नहीं करना चाहिए।
एक स्पष्ट डिलीट-जैसे ऑपरेशन में संदर्भ संख्या शून्य होने पर ही मुक्त किया जाता है। जैसे कुछ में:
template<typename T> class explicit_delete_ref_cnt_ptr {
private:
T* ptr;
int rc;
...
public:
void delete_if_rc0() {
if( this->ptr ) {
this->rc--;
if( this->rc == 0 ) {
delete this->ptr;
}
this->ptr = 0;
}
}
};
ठीक है, ऐसा कुछ। Rc pted विध्वंसक में इंगित की गई ऑब्जेक्ट को स्वचालित रूप से डिलीट नहीं करने के लिए यह एक असामान्य बात है कि एक पॉइंटेड पॉइंटर टाइप किया गया है। लेकिन ऐसा लगता है कि यह नग्न बिंदुओं और आरसीडेड बिंदुओं को थोड़ा सा सुरक्षित कर सकता है।
लेकिन अभी तक इसे हटाने की कोई आवश्यकता नहीं है।
लेकिन फिर यह मेरे साथ हुआ: यदि ऑब्जेक्ट ने इंगित किया, तो पॉइंटीटी को पता है कि यह संदर्भ में गिना जा रहा है, उदाहरण के लिए यदि गिनती ऑब्जेक्ट के अंदर है (या किसी अन्य तालिका में), तो नियमित रूप से delete_if_rc0 एक विधि हो सकती है नुकीली वस्तु, न कि (स्मार्ट) सूचक।
class Pointee {
private:
int rc;
...
public:
void delete_if_rc0() {
this->rc--;
if( this->rc == 0 ) {
delete this;
}
}
}
};
वास्तव में, यह बिल्कुल सदस्य विधि होने की जरूरत नहीं है, लेकिन एक नि: शुल्क समारोह हो सकता है:
map<void*,int> keepalive_map;
template<typename T>
void delete_if_rc0(T*ptr) {
void* tptr = (void*)ptr;
if( keepalive_map[tptr] == 1 ) {
delete ptr;
}
};
(BTW, मुझे पता है कि कोड काफी सही नहीं है - अगर मैं सभी विवरण जोड़ देता हूं तो यह कम पठनीय हो जाता है, इसलिए मैं इसे इस तरह से छोड़ रहा हूं।)
delete this
कक्षा के बीच एक तंग युग्मन बनाया है और उस वर्ग की वस्तुओं को बनाने के लिए उपयोग की जाने वाली आवंटन विधि। यह बहुत ही खराब OO डिजाइन है, क्योंकि OOP में सबसे बुनियादी चीज स्वायत्त कक्षाएं बनाना है जो कि यह नहीं जानते या परवाह नहीं करते हैं कि उनका कॉलर क्या कर रहा है। इस प्रकार एक ठीक से डिज़ाइन की गई कक्षा को यह पता नहीं होना चाहिए कि उसे किस तरह से आवंटित किया गया है। यदि आपको किसी कारणवश इस तरह के अजीबोगरीब तंत्र की आवश्यकता है, तो मुझे लगता है कि वास्तविक वर्ग के आसपास रैपर क्लास का उपयोग करने के लिए बेहतर डिज़ाइन होगा, और रैपर को आवंटन से निपटने दें।