/ / स्थिर क्षेत्रों के लिए विध्वंसक। सिंगलटन बोध - c ++, डिज़ाइन-पैटर्न, स्थिर, सिंगलटन

स्थिर क्षेत्रों के लिए विनाशक। सिंगलटन अहसास - सी ++, डिजाइन-पैटर्न, स्थिर, सिंगलटन

तो, क्लासिक सरल सिंगलटन अहसास निम्नलिखित है:

class Singleton
{
private:
static Singleton* singleton;
Singleton() {}
public:
static Singleton* getInstance();
};

सीपीपी फ़ाइल:

Singleton* Singleton::singleton = 0;

Singleton* Singleton::getInstance()
{
if (!singleton)
{
singleton = new Singleton;
}

return singleton;
}

मुझे यहां स्मृति रिसाव दिखाई दे रहा है - "नहीं है हटाना के लिए नया। लेकिन C ++ में "t स्टेटिक डिस्ट्रक्टर" नहीं है, इसलिए हम इस मेमोरी लीक के बारे में परवाह नहीं करते हैं?

उत्तर:

उत्तर № 1 के लिए 23

एक मेमोरी लीक सिर्फ एक आवंटन से अधिक हैबिना किसी मिलान के। यह तब होता है जब आपके पास स्मृति होती है जिसे पुनः प्राप्त किया जा सकता है क्योंकि ऑब्जेक्ट अब उपयोग में नहीं है, लेकिन जो कभी नहीं करता है वह वास्तव में मुक्त हो जाता है। वास्तव में, कई मेमोरी लीक ऐसे मामले होते हैं जहां मेमोरी को डील करने के लिए प्रोग्राम में कोड होता है, लेकिन जो भी कारण से इसे "टी" कहा जाता है (उदाहरण के लिए, एक संदर्भ चक्र)। वास्तव में, "कैसे पर बहुत शोध। लीक के इन प्रकार का पता लगाने; यह कागज़ इस तरह के एक उपकरण का एक उत्कृष्ट उदाहरण है।

एक सिंगलटन के मामले में, हमारे पास "एक रिसाव नहीं है क्योंकि वह सिंगलटन पूरे कार्यक्रम में मौजूद है। इसका जीवनकाल कभी समाप्त नहीं होता है, और इसलिए मेमोरी को पुनः प्राप्त नहीं किया जा रहा है" कोई समस्या नहीं है।

उस ने कहा, आपके ऊपर जो कोड है वह यह नहीं है कि ज्यादातर लोग एक सिंगलटन को कैसे लागू करेंगे विहित C ++ कार्यान्वयन कुछ इस तरह होगा:

class Singleton
{
private:
/* No instantiation. */
Singleton() {}

/* Explicitly disallow copying. */
Singleton(const Singleton&) = delete;
Singleton& operator= (const Singleton&) = delete;

/* In C++03, the above would be written as
*
*    Singleton(const Singleton&);
*    Singleton& operator= (const Singleton&);
*
* and you"d just leave the methods unimplemented.
*/
public:
static Singleton& getInstance();
};

.cpp फ़ाइल:

Singleton& Singleton::getInstance() {
/* Have a static local variable representing the unique instance.  Since
* it"s static, there is only one instance of this variable.  It"s also only
* initialized when getInstance is called.
*/
static Singleton theInstance;
return theInstance;
}

अब वहाँ कोई गतिशील आवंटन नहीं है - दमेमोरी को कंपाइलर द्वारा आवंटित किया जाता है और संभवतः ढेर के बजाय कोड या डेटा सेगमेंट में रहता है। यह भी ध्यान दें कि आपको नकल को स्पष्ट रूप से अस्वीकार करना होगा, या अन्यथा आप सिंगलटन के कई क्लोन के साथ समाप्त हो सकते हैं।

इसका अन्य लाभ यह है कि C ++ गारंटी देता है कि प्रोग्राम एग्जिट (प्रोग्राम को सामान्य रूप से समाप्त होने पर), के लिए विनाशकारी है theInstance वास्तव में कार्यक्रम के अंत में आग लग जाएगी। इस प्रकार आप अपने द्वारा आवश्यक सभी सफाई कोड के साथ एक विनाशकारी को परिभाषित कर सकते हैं

उम्मीद है की यह मदद करेगा!


जवाब के लिए 2 № 2

जब कोई मेल न हो, तो आपको ऐसे कोड से बचना चाहिए delete के लिये new

जबकि कोई वास्तविक नहीं है स्मृति रिसाव (अधिकांश आधुनिक ऑपरेटिंग सिस्टम में), इससे भी बुरी बात यह है कि आपके Singleton विध्वंसक नहीं कहा जाता है। और यदि आप कुछ संसाधनों का अधिग्रहण करते हैं, तो वे संभवतया होगा रिसाव।

यहां क्या किया जा सकता है

उदाहरण के लिए, स्टोर करने के लिए स्मार्ट पॉइंटर का उपयोग करें std::unique_ptr (C ++ 11 के साथ) या boost::auto_ptr


जवाब के लिए 0 № 3

जब किसी फ़ंक्शन के लिए वैरिएबल लोकल को "स्टैटिक" घोषित किया जाता है, तो इसका मतलब है कि यह स्टैक पर आवंटित नहीं किया गया है - और यह कि इसकी वैल्यू एक कॉल से दूसरे पर बनी रहती है।