2010-02-17 21 views
9

Giả sử tôi có:destructor tĩnh

void foo() { 
    static Bar bar; 
} 

Liệu C++ đảm bảo với tôi rằng Bar :: Bar() được gọi trên quầy bar, và Bar :: ~ Bar() là không bao giờ kêu gọi thanh? (Cho đến sau khi thoát ra chính).

Cảm ơn!

Trả lời

13

Có. Lần đầu tiên foo() được gọi là, Bar bar sẽ được xây dựng. Sau đó nó sẽ có sẵn cho đến khi kết thúc main(), sau đó nó sẽ bị hủy.

Đó là về cơ bản:

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

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

Lưu ý tôi nói "cơ bản"; điều này có lẽ không phải là những gì thực sự xảy ra (mặc dù tôi không nghĩ rằng nó quá xa).


3.7.1 Thời hạn lưu trữ tĩnh
1 Tất cả các đối tượng mà không có thời gian lưu trữ năng động cũng không phải là địa phương có thời gian lưu trữ tĩnh. Việc lưu trữ cho các đối tượng này sẽ kéo dài trong suốt thời gian của chương trình (3.6.2, 3.6.3).