Tôi muốn biết các hàm đã đăng ký với atexit()
có được gọi là trước hoặc sau khi các biến toàn cục bị hủy. Điều này có được xác định bởi tiêu chuẩn hoặc thực hiện được xác định không?Khi nào một hàm được đăng ký với atexit() được gọi là
Trả lời
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 đếnstd::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 đếnstd::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 đếnstd::atexit
. Nếu cuộc gọi đếnstd::atexit
được sắp xếp theo trình tự trước một cuộc gọi khác đếnstd::atexit
, cuộc gọi đến hàm được chuyển đến cuộc gọi thứ haistd::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ênstd::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.
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
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. –