2010-06-17 35 views
5

thể trùng lặp:
What is the lifetime of a static variable in a C++ function?Khi nào chính xác là hàm dựng của đối tượng địa phương tĩnh được gọi?

Giả sử chúng ta có một mã như thế này:

Some class { 
    Some() { // the ctor code } 
}; 

Some& globalFunction() 
{ 
    static Some gSome; 
    return gSome; 
} 

Khi chính xác 'mã ctor' được thực hiện? Đối với các biến tĩnh bình thường trước main() hoặc tại thời điểm đầu tiên chúng ta gọi 'globalFunction()'?

Làm cách nào trên các nền tảng khác nhau và các trình biên dịch khác nhau (cl, gcc, ...)?

Cảm ơn

-hb-

+1

Dupe http://stackoverflow.com/questions/246564/what-is-the-lifetime-of-a-static-variable-in-ac-function –

Trả lời

4

Các Some constructor sẽ được chạy trên các cuộc gọi đầu tiên để globalFunction(). Điều này được thảo luận trong Hiệu ứng C++ của Scott Meyer, Mục 4.

Điều này được thực thi theo tiêu chuẩn.

Lưu ý rằng vẫn có thể có sự cố với trình phá hủy! Nói chung, không thể biết khi nào an toàn để xóa đối tượng này, một luồng khác (có thể sống quá khứ) có thể gọi hàm này sau khi tĩnh cục bộ đã bị hủy, vì lý do này, các đối tượng này thường bị 'rò rỉ' bằng cách tạo chúng với 'mới'.

Nhưng, cũng lưu ý rằng việc tạo các đối tượng tĩnh như thế này không phải là luồng an toàn.

Đối tượng tĩnh toàn cục sẽ được tạo trước chính, đó là một thứ tự không xác định.

+0

Cảm ơn bạn Stephen, tôi có thể trích dẫn bạn trong một lỗi mozilla bình luận? –

+0

Câu hỏi này nhắc tôi về một bài viết tuyệt vời về sự đơn giản và an toàn chủ đề trong C++: http://www.drdobbs.com/184405726 và http://www.drdobbs.com/184405772 – fingerprint211b

+0

@Honza: chắc chắn mọi thứ, xin vui lòng bình luận với một liên kết, tôi muốn đọc nó :) [lưu ý: rằng có (như mọi khi) một số trường hợp đặc biệt này - đặc biệt là phần an toàn thread ... vì vậy trong một số điều kiện đặc biệt nó có thể được ok] – Stephen

Các vấn đề liên quan