इस संरचना की बात एक निर्माण लागू करने के क्रम है (और इस प्रकार एक विनाश आदेश)।
निर्माण
चूंकि इन स्थानीय स्थैतिक चर रहे हैं, निर्माण के आदेश जिस क्रम में अपने-अपने Instance
कार्यों पहली बार के लिए कहा जाता है से निर्धारित होता है।
चूंकि यह main
में किया गया है, निर्माण आदेश पूरी तरह से निर्दिष्ट है।
आदेश अनिर्दिष्ट बनाने के लिए एक ही रास्ता है अगर आप उदाहरण के लिए अलग अलग अनुवाद इकाइयों में स्थिर initialisation में उन्हें इस्तेमाल, अगर एक
C& the_c = C::Instance();
है और अन्य है
D& the_d = D::Instance();
विनाश
स्थिर भंडारण वाले वस्तुओं का विनाश निर्माण के आदेश के विपरीत है।
3.6.3, समाप्ति, अनुच्छेद 1:
निर्माता या स्थिर भंडारण अवधि के साथ एक वस्तु के गतिशील आरंभीकरण के पूरा होने एक और, के नाशक के पूरा होने की है कि इससे पहले कि अनुक्रम है, तो दूसरा को पहले के विनाशक की शुरुआत से पहले अनुक्रमित किया गया है।
तो विनाश आदेश पूरी तरह से निर्माण आदेश द्वारा निर्दिष्ट किया गया है।
ध्यान दें कि यह सिंगलटन निर्माण अच्छी तरह से निर्दिष्ट है भले ही उनमें से एक अनुवाद इकाई के बावजूद दूसरे पर निर्भर करता है।
है यही कारण है, यह पूरी तरह से सुरक्षित है, और यह कोई फर्क नहीं पड़ता है जहाँ यह परिभाषित किया है:
class C {
public:
static C& Instance() {
static C c(D::Instance());
return c;
}
~C(){ m_d.doSomething(); } // Yes, this is safe.
private:
C(D& d) : m_d(d) { m_d.doSomething(); } // Yes, this is safe.
D& m_d;
};
मुझे नहीं लगता कि मानक वास्तव में यह परिभाषित करता है, के रूप में यह वैश्विक के विनाश के क्रम को परिभाषित नहीं करता ऑब्जेक्ट्स, केवल वे रिवर्स ऑर्डर में नष्ट हो जाते थे, जहां उन्होंने –
का निर्माण किया था विनाश का आदेश एक [अनुवाद इकाई] (https://en.wikipedia.org/wiki/Translation_unit_ (प्रोग्रामिंग) के भीतर अच्छी तरह से परिभाषित किया गया है)। लेकिन अनुवाद इकाइयों के बीच नहीं। –
[एक संबंधित प्रश्न और उत्तर] (http://stackoverflow.com/q/246564/440558)। –