Những gì tôi biết về C++ là thứ tự của các công trình (và hủy) của các cá thể toàn cầu không nên được giả định.Là std :: cout đảm bảo được khởi tạo?
Trong khi tôi đang viết mã với một cá thể chung sử dụng std::cout
trong hàm tạo & destructor, tôi có một câu hỏi.
std::cout
cũng là phiên bản toàn cục của iostream. Có phải std::cout
được đảm bảo được khởi chạy trước bất kỳ phiên bản toàn cầu nào khác không?
Tôi đã viết một mã kiểm tra đơn giản và nó hoạt động hoàn hảo, nhưng tôi vẫn không biết tại sao.
#include <iostream>
struct test
{
test() { std::cout << "test::ctor" << std::endl; }
~test() { std::cout << "test::dtor" << std::endl; }
};
test t;
int main()
{
std::cout << "Hello world" << std::endl;
return 0;
}
It in
test::ctor
Hello world
test::dtor
Có bất kỳ khả năng rằng mã không chạy như mong đợi?
Liên quan đến http://stackoverflow.com/questions/6919593/is-cout-guaranteed-available-during-static-deinitialization cũng bao gồm việc xây dựng trong câu trả lời. – adl
Thứ tự khởi tạo của các đối tượng thời gian lưu trữ tĩnh ở phạm vi toàn cục không thể giả định được nhưng có các thủ thuật để buộc thứ tự khởi tạo. –
PS.Cũng lưu ý thứ tự hủy diệt được đảm bảo (nghịch đảo của việc xây dựng). –