2013-04-09 34 views
10

Đây là mã (có giá trị C và C++)Có bảo hành tự động xả trước khi thoát không? Làm thế nào nó hoạt động?

#include <stdio.h> 

int main() { 
    printf("asfd"); 
    // LINE 1 
    return 0; 
} 

Nếu trong dòng 1 Tôi đặt segfaulting biểu hiện chương trình sẽ chỉ sụp đổ mà không in bất cứ điều gì (như mong đợi).

Nhưng tại sao mã ở trên in "asdf" và không thoát mà không có bộ đệm bị xóa? Những gì là dưới mui xe và tại sao nó hoạt động như mong đợi?

+0

Không sử dụng printf trong C++ !! –

+1

lưu ý: câu hỏi này được gắn thẻ kép nhưng câu trả lời khác với C so với C++. Câu trả lời của Raymond Chen bao gồm C++. @JensGustedt 's câu trả lời bao gồm C (nhưng đã bị xóa ...) –

Trả lời

17

này được thực hiện bằng hai phần trong ngôn ngữ C++ đặc điểm kỹ thuật:

[basic.start.main]

Một tuyên bố trở lại trong main có tác dụng vì vậy hàm main và gọi số exit với giá trị trả về làm đối số.

[lib.support.start.term]

Chức năng exit có hành vi bổ sung trong tiêu chuẩn quốc tế này:

  • ...
  • Tiếp theo, tất cả các luồng C mở với dữ liệu đệm không được viết ar e ửng đỏ.
  • ...
+0

Thú vị nếu đó là có thể mở rộng các thủ tục mà 'thoát' thực hiện hoặc thậm chí quá tải nó. Tôi nên thử –

+4

@sasha.sochka: Bạn không thể quá tải chức năng 'thoát '; nếu bạn thử, chức năng của bạn sẽ không được gọi. Tuy nhiên, bạn có thể đăng ký các hàm được gọi khi thoát bằng cách sử dụng hàm ['atexit (3)'] (http://linux.die.net/man/3/atexit). –

+0

Câu hỏi đặt ra là "Cái gì dưới mui xe?" Tôi giải thích điều này khi hỏi cách hành vi được thực hiện. Câu trả lời này chỉ trích dẫn tiêu chuẩn nói rằng nó phải được thực hiện. –

1

Khi thoát main(), tất cả các luồng đang mở đều bị đóng ... để bao gồm stdout. Đóng dòng đang mở tuôn ra stdout và những gì bạn đã viết cho bộ đệm được cam kết có hoặc không có dòng mới.

2

Nói chung, một trở về từ main không phải là kết thúc của chương trình của bạn, cũng không phải là nhập cảnh vào main đầu.

Thông thường, trình liên kết tạo tệp thực thi cuối cùng cho chương trình của bạn đánh dấu một số vị trí, có thể có tên là start, là nơi thực hiện bắt đầu. Khi hệ điều hành tải chương trình của bạn và bắt đầu thực hiện nó, nó sẽ bắt đầu thực hiện tại nơi này. Có mã ở đó để thiết lập một môi trường: Tạo một ngăn xếp, đặt trạng thái luồng, v.v. Sau đó, mã này gọi main.

Khi trả lại số main, mã này trở lại mã đặc biệt này. Mã đó sau đó thực hiện các công việc dọn dẹp khác nhau được yêu cầu ở cuối chương trình C hoặc C++, như được mô tả trong this answer.

Nếu chương trình bị chấm dứt đột ngột, mã cuối cùng này có thể không được thực hiện.

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