2009-08-07 9 views
18

मेरे पास कोड है जो स्कोप के आधार पर एक म्यूटेक्स लॉक/अनलॉक नियंत्रित करता है:जब आप ढेर पर वस्तुएं घोषित की जाती हैं तो क्या आप विनाशक आदेश की गारंटी दे सकते हैं?

void PerformLogin() 
{ 
    ScopeLock <Lock> LoginLock(&m_LoginLock); 

    doLoginCommand(); 

    ScopeLock <SharedMemoryBase> MemoryLock(&m_SharedMemory); 

    doStoreLogin(); 

    ... 
} 

क्या मैं गारंटी दे सकता हूं कि LoginLockLoginLock से पहले नष्ट हो जाएगा?

उत्तर

36

हां, यह है। किसी विशेष क्षेत्र में स्थानीय वस्तुओं को रिवर्स ऑर्डर में नष्ट कर दिया जाता है, जिनका निर्माण किया गया था।

11

हां, विनाशकों को निर्माण के विपरीत क्रम में बुलाया जाता है।

11

नील के उत्तर में जोड़ना।

विचार करें कि विपरीत सत्य था, यानी कि आप घोषित चर के लिए विनाशकों के आदेश की भविष्यवाणी नहीं कर सके। इससे ढेर पर निर्भर मूल्य प्रकारों का उपयोग करना लगभग असंभव हो जाएगा।

void Foo() { 
    Type1 t1; 
    Type2 t2(&t1); 
    ... 
} 

पर विचार सी ++ नाशक आदेश की गारंटी नहीं किया, तो इस तरह सीधे आगे कोड अविश्वसनीय रूप से असुरक्षित हो, क्योंकि यह संभव होगा t1 नष्ट हो के लिए पहले t2 नाशक भाग गया होगा। इसलिए आप टी 2 के विनाशक को वैध टी 1 मान के साथ चलाने की गारंटी नहीं दे सका।

+0

ग्रेट उत्तर। मेरे पास कुछ कोड है जो विनाशक कॉल के आदेश पर निर्भर करता है और मैं एक ठोस कारण की तलाश में था कि मेरे कोड पर भरोसा करने से पहले उन्हें हमेशा किसी विशेष तरीके से आदेश दिया गया था। –

3

सवाल पहले से ही उत्तर था, लेकिन मैं जोड़ने के लिए है कि मैं आम तौर पर कुछ इस तरह लिखने की एक आदत है करना चाहते हैं:

void PerformLogin() 
{ 
    ScopeLock <Lock> LoginLock(&m_LoginLock); 
    doLoginCommand(); 

    { 
     ScopeLock <SharedMemoryBase> MemoryLock(&m_SharedMemory); 
     doStoreLogin(); 
     ... 
    } 
} 

मेरी राय में, इस आशय स्पष्ट करता है (*)। यह प्रासंगिक हो सकता है यदि आपका कोड वास्तव में विशिष्ट क्रम पर पर निर्भर करता है। मुझे लगता है कि इससे कम संभावना है कि कोई गलती से ऑर्डर बदलता है, और हार्ड-टू-बग बग का कारण बनता है। (ठीक है, कि बेशक एक गैर मुद्दा है, क्योंकि हम सभी जगह में परीक्षण हमारे पास है, है ना?)

मैं हमेशा निरर्थक कोष्ठकों कुछ में   (a && b) || c   की तरह भी लिखते हैं, और मैं इस मामले में काफी खोजने के समान।

(*): बेशक, आप एक टिप्पणी का भी उपयोग कर सकते हैं।

0

हां, विनाशक रचनाकारों के विपरीत हैं। क्योंकि विनाशकों का उपयोग उन वस्तुओं को हटाने के लिए किया जाता है जिन्हें अब आवश्यक नहीं है और ऑब्जेक्ट बनाने के लिए कन्स्ट्रक्टर का उपयोग किया जाता है।

संबंधित मुद्दे