2012-04-30 7 views
12

सी ++ में, किसी ऑब्जेक्ट के विनाशक को उस ब्लॉक के लिए "}" बंद करने पर बुलाया जाता है, ठीक है? तो इसका मतलब है कि अगर मेरे पास है:सी ++ - यदि किसी ऑब्जेक्ट को लूप में घोषित किया गया है, तो क्या इसका विनाशक लूप के अंत में बुलाया जाता है?

while(some_condition) 
{ 
    SomeClass some_object; 
    some_object.someFunction(); 
    some_variable = some_object.some_member; 
} 

फिर पाश में से एक यात्रा में बनाया वस्तु के लिए नाशक पाश से पहले किसी अन्य वस्तु बन जाता है, सही के अंत में कहा जाएगा?

धन्यवाद।

+0

[लूप के भीतर घोषणा के जीवनकाल] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3768662/lifetime-of-declaration-within-a-loop) –

उत्तर

24

हां।

लेकिन आप इसे स्वयं परीक्षण कर सकते थे। यह एक भाषा सुविधा है कि संकलक गलत होने की संभावना नहीं है।

#include <iostream> 

struct S { 
    S() { std::cout << "S::S()\n"; } 
    ~S() { std::cout << "S::~S()\n"; } 
}; 

int main() { 
    int i = 10; 
    while(i--) { 
    S s; 
    } 
} 
+0

लघु, मीठा, सही। == +1 – duffymo

+0

स्वीकार करने पर समय प्रतिबंध मुझे अनुमति देने के बाद मैं थोड़ा सा जवाब दूंगा। –

+0

मुझे नहीं पता, कंपेलर चीजें गलत होने पर _really good_ हैं ... :) +1 –

7

अवलोकन योग्य व्यवहार यह है कि इसे प्रत्येक पुनरावृत्ति कहा जाता है।

हालांकि अनुकूलन के बारे में सामान्य नियम अभी भी लागू होते हैं। संकलक चालाक है और वस्तु सरल तो संकलक कुछ भी कर सकते यह पसंद करती है कि अभी भी सही व्यवहार, उदा .:

#include <iostream> 

struct foo { 
    int i; 
    foo() : i (-1) {} 
    ~foo() { i = 1; } 
}; 

int main() { 
    int i = 10; 
    while (--i) { 
    foo f; 
    std::cout << f.i; 
    } 
} 

को संकलित करता है पैदा करता है, तो:

.Ltmp5: 
     .cfi_def_cfa_register %rbp 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     movl $_ZSt4cout, %edi 
     movl $-1, %esi 
     callq _ZNSolsEi 
     xorl %eax, %eax 
     popq %rbp 
     ret 

अर्थात अनियंत्रित और वहां उस विनाशक का कोई संकेत नहीं है (हालांकि देखने योग्य व्यवहार अभी भी वही है)।

+3

कोड जो मेरे सिस्टम पर उत्पन्न होता है यदि सदस्य सिर्फ एक int से थोड़ा अधिक जटिल है और लूप काउंटर के आधार पर भिन्न होता है काफी रोचक है - मूल रूप से आप द्विआधारी, पूर्व-गणना के अंदर रहने वाले 'foo'' के प्रत्येक व्यक्तिगत तत्कालता के लिए स्मृति के साथ समाप्त होते हैं। – Flexo

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

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