2011-08-14 43 views
16

thể trùng lặp:
Will exit() or an exception prevent an end-of-scope destructor from being called?Các trình phá hủy có chạy khi gọi exit() không?

Trong C++, khi ứng dụng gọi exit (3) là các hàm hủy trên stack nghĩa vụ phải được chạy để thư giãn stack?

+0

Và, có cách tiếp cận khác không? 'throw' một kiểu đặc biệt thay vì gọi' exit', bắt nó trong 'main', và sau đó' return' từ 'main' thay vì' exit' từ 'main'? –

+1

@AaronMcDaid Tôi không hiểu câu hỏi của bạn. Cách tiếp cận thay thế cho cái gì? Những gì bạn sẽ cố gắng thực hiện bằng cách tránh một cuộc gọi đến 'exit()'? Trong một trong các ứng dụng của tôi, tôi ném một đối tượng 'customExit' và bắt nó trong chính và sử dụng một giá trị nguyên từ đối tượng' customExit' để cung cấp giá trị trả về từ chính, theo cách này, các RAII destructors của tôi được chạy để dọn dẹp những thứ như Hồ sơ tạm thời. – WilliamKF

+0

bình luận của bạn đã trả lời chính xác câu hỏi của tôi (viết sai). Cảm ơn! Về cơ bản, tôi muốn xác nhận rằng người khác sử dụng phương pháp 'ném' này để đảm bảo mọi thứ bị phá hủy trong một lối thoát chương trình bình thường –

Trả lời

28

Không, hầu hết các trình phá hủy không chạy trên exit().

C++ 98 §18.3/8 thảo luận về điều này.

Về cơ bản, khi exit được gọi là đối tượng tĩnh bị hủy, xử lý atexit, mở luồng C bị xóa và đóng và các tệp được tạo bởi tmpfile bị xóa. Các đối tượng tự động cục bộ không bị hủy. Tức là, không có thư giãn.

Gọi abort thậm chí còn ít xảy ra hơn: không dọn dẹp bất cứ thứ gì.

+0

Đối với những người không muốn dọn dẹp, _exit() có thể là một cuộc gọi tốt hơn abort(), vì hủy bỏ sẽ tăng tín hiệu SIGABRT, thường dẫn đến hành vi khá giống với một vụ tai nạn. –

5

Nếu hệ điều hành của bạn là hợp lý (Unix, Linux hoặc Windows gần đây), hãy gọi exit() để cho hạt nhân ngừng phân bổ tất cả bộ nhớ của quy trình. Các ngăn xếp không cần phải được unwound; nó sẽ đơn giản chấm dứt tồn tại.

+13

Và bất kỳ mã RAII nào trong các trình phá hủy ngăn xếp sẽ KHÔNG được gọi. Mà có thể không quan trọng nếu nó chỉ đề cập đến bộ nhớ riêng tư cho quá trình; nhưng điều quan trọng nếu nó đề cập đến (a) các tệp cần được xóa hoặc đổi tên hoặc làm sạch, và (b) tính toàn vẹn của cấu trúc dữ liệu được chia sẻ giữa các tiến trình trong bộ nhớ dùng chung. // Vì những lý do như vậy, một số dự án đã cấm sử dụng lối ra, và/hoặc đã định nghĩa lại exit() để ném một ngoại lệ mà sẽ gây ra việc mở thư. –

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