Có nhiều cách khác nhau để thoát khỏi quy trình:Các cách thoát khác nhau của quy trình trong C++
ví dụ: ExitProcess, ExitThread (từ chủ đề chính), thoát, hủy, trả về từ chính, chấm dứt.
Tôi muốn biết các hiệu ứng của từng phương pháp có đối với việc hủy đối tượng tĩnh/toàn cầu/tự động.
Ví dụ, tôi có một dự án bị treo (có thể do một số lỗi deallocation) khi ExitProcess được gọi, nhưng không phải khi exit() được gọi. (liên quan đến this question, tình cờ).
Vì vậy, về cơ bản, tôi muốn biết trong trường hợp nào việc giải quyết các đối tượng trên xảy ra và theo thứ tự nào (Đối với VC++).
trên thực tế ExitProcess không gọi atexit đăng ký. destructors toàn cầu, nếu chúng được định nghĩa trong một DLL. Nó phụ thuộc vào thứ tự của các cuộc gọi đến DLLMain (tách quy trình). ExitProcess dường như loại bỏ các tệp DLL đầu tiên và sau đó cố gắng dọn sạch các giá trị riêng của nó và thoát() làm điều ngược lại. Vì vậy, nếu bạn khai báo các statics dựa vào một số DLL bên ngoài, chúng có thể không bị phá hủy thông qua ExitProcess. (Điều này dựa trên một số thử nghiệm tôi đã thực hiện hôm nay.) –
Thú vị là các DLL khác dường như gọi hàm hủy của chúng khi chúng nhận được DLL_PROCESS_DETACH.Các tài liệu cho ExitProcess() không nói theo thứ tự các điểm nhập của DLL được gọi, nhưng ngay cả khi chúng được gọi theo thứ tự LIFO, tôi nghĩ rằng các vấn đề vẫn có thể phát sinh nếu các đối tượng toàn cầu trong các DLL khác nhau tham chiếu lẫn nhau. –
Gọi dtors từ DLL_PROCESS_DETACH có ý nghĩa nếu bạn nhận thấy họ gọi ctors từ DLL_PROCESS_ATTACH. Nhưng nó thực sự lên đến trình biên dịch mà tạo ra các DLL và người gọi để sắp xếp này. Nhìn vào DLL tải lười biếng để xem một con đường thực hiện có thể. – MSalters