2010-02-17 15 views
9

मान लीजिए मैं:स्थिर नाशक

void foo() { 
    static Bar bar; 
} 

ग मुझे गारंटी ++ यह है कि बार :: बार() पट्टी पर कहा जाता है, और बार :: ~ बार() पट्टी पर कहा जाता है कभी नहीं कर रहा है? (मुख्य निकास के बाद तक)।

धन्यवाद!

उत्तर

13

हां। पहली बार foo() कहा जाता है, Bar bar का निर्माण किया जाएगा। यह तब तक उपलब्ध होगा जब तक main() खत्म नहीं हो जाता है, जिसके बाद यह नष्ट हो जाएगा।

यह अनिवार्य है:

static Bar *bar = 0; 
if (!bar) 
{ 
    bar = new Bar; 

    // not "real", of course 
    void delete_bar(void) { delete bar; } 
    atexit(delete_bar); 
} 

नोट मैं "अनिवार्य" कहा; यह शायद वास्तव में नहीं होता है (हालांकि मुझे नहीं लगता कि यह बहुत दूर है)।


3.7.1 स्टेटिक भंडारण अवधि
1 सभी वस्तुओं जो न तो गतिशील भंडारण अवधि है और न ही स्थानीय हैं स्थिर भंडारण अवधि की है। इन वस्तुओं के लिए भंडारण कार्यक्रम की अवधि (3.6.2, 3.6.3) के लिए रहेगा।

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