2012-11-27 33 views

Trả lời

20

Người ta cũng xác định trước, và phụ thuộc vào việc các đối tượng trong câu hỏi được xây dựng trước hoặc sau khi chức năng đã đăng ký sử dụng atexit():

3.6.3 Chấm dứt

3. Nếu hoàn thành việc khởi tạo một đối tượng có thời gian lưu trữ tĩnh được giải trình tự trước khi gọi đến std::atexit (xem <cstdlib>, 18.5), lệnh gọi hàm được chuyển đến std::atexit được sắp xếp theo trình tự trước c tất cả với destructor cho đối tượng. Nếu một cuộc gọi đến std::atexit được giải trình tự trước khi hoàn thành việc khởi tạo một đối tượng có thời lượng lưu trữ tĩnh, lệnh gọi hàm hủy đối tượng được sắp xếp trước khi cuộc gọi đến hàm được chuyển đến std::atexit. Nếu cuộc gọi đến std::atexit được sắp xếp theo trình tự trước một cuộc gọi khác đến std::atexit, cuộc gọi đến hàm được chuyển đến cuộc gọi thứ hai std::atexit được sắp xếp trước khi cuộc gọi đến hàm được chuyển đến cuộc gọi đầu tiên std::atexit. giải thích

giáo dân của tôi ở trên là những thứ đó đã được xây dựng trước khi bạn gọi atexit(handler) bị phá hủy sauhandler() được gọi, và ngược lại. Tôi chắc chắn có sự tinh tế, nhưng điều này có vẻ là nguyên tắc cơ bản.

+4

Về cơ bản, có. Từ ngữ trong tiêu chuẩn phức tạp hơn vì trong một chương trình đa luồng, "trước" và "sau" có các định nghĩa phức tạp và không phải lúc nào cũng hoạt động như bạn mong đợi. – aschepler

+1

Với một lưu ý rằng 'construct' có nghĩa là * hàm tạo đã kết thúc * và chúng ta chỉ xem xét các đối tượng hoàn chỉnh, không phải là các căn cứ hoặc các thuộc tính. –

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