आइए कहें कि मेरे पास दो स्थानीय वस्तुएं हैं। जब फ़ंक्शन वापस आता है, तो क्या यह गारंटी दी जाती है कि पहले कौन सा दायरा से बाहर निकल जाएगा?कॉलिंग विनाशक के आदेश और बिंदु
उदाहरण के लिए:
class MutexLock
{
/* Automatic unlocking when MutexLock leaves a scope */
public:
MutexLock (Mutex &m) { M.lock(); }
~MutexLock(Mutex &m) { M.unlock(); }
};
यह एक बहुत ही आम है जब क्षेत्र से बाहर जाने पर आप स्वत म्युटेक्स जारी करने के लिए इस्तेमाल किया चाल है:
मैं इस तरह एक वर्ग है। लेकिन अगर मुझे दायरे में दो म्यूटेक्स चाहिए तो क्या होगा?
void *func(void *arg)
{
MutexLock m1;
MutexLock m2;
do_work();
} // m1 and m2 will get unlocked here. But in what order? m1 first or m2 first?
यह वास्तव में किसी भी डेडलॉक का कारण नहीं बन सकता है। लेकिन ऐसे कई उदाहरण हो सकते हैं जिनमें संसाधन जारी करने का आदेश उपयोगकर्ता के लिए उपयोगी हो सकता है। उस मामले में विनाशकों पर भरोसा करने के बजाय स्पष्ट होना महत्वपूर्ण है?
इसके अलावा, किसी भी मामले में संकलक द्वारा विनाश में देरी हो सकती है? क्या मेरा मतलब है
func()
{
{
foo f();
} ---------> Can compiler choose to not destroy f here, rather do it at the time when func() is returning.
}
@ एक्स के उत्तर के पहले भाग का समर्थन करने के लिए, यह मानक (ड्राफ्ट संस्करण, दिनांक: 2006-11-06 --- का एक अंश है - यह पहलू बाद के संस्करणों में नहीं बदला गया है। स्पष्टता के लिए छोड़े गए अनुभागों के संदर्भ): "एक दायरे से बाहर निकलने पर (हालांकि पूरा किया गया), विनाशकों को स्वचालित रूप से भंडारण अवधि (नामित वस्तुएं या अस्थायी) के साथ सभी निर्मित वस्तुओं के लिए बुलाया जाता है, जिन्हें उनकी घोषणा के विपरीत क्रम में घोषित किया जाता है।" बेशक आपके उदाहरण में स्वचालित परिवर्तनीय घोषणाएं शामिल हैं। – sturmer