Có, như mọi người khác nói. C++ quy định/ủy nhiệm điều này.
Nhưng chỉ để thêm vào đó, cho đầy đủ: nếu goto
của bạn sử dụng các phần mở rộng goto
computed- tìm thấy trong một số trình biên dịch - gcc, kêu vang, có thể những người khác nhưng không bao gồm MSVC cuối cùng tôi biết - hay không đối tượng của destructor sẽ được gọi là khá mơ hồ. Khi một số goto
chuyển đến một địa điểm duy nhất, nó rất rõ ràng những gì destructors phải được gọi trước khi kiểm soát dòng chảy chuyển giao. Nhưng với tính toán goto
, các trình phá hủy khác nhau có thể cần phải được gọi động, để cung cấp cho các ngữ nghĩa "dự kiến". Tôi không chắc chắn những gì trình biên dịch thực hiện phần mở rộng này làm, trong những trường hợp. Bộ nhớ của tôi khi gặp phải điều này là clang cảnh báo khi một tính toán-goto
có thể để lại một phạm vi với một đối tượng có một destructor không trival, tuyên bố destructor sẽ không được gọi. Trong một số trường hợp có thể là tốt, trong những trường hợp khác thì không. Tôi không biết những gì các trình biên dịch khác làm. Chỉ cần nhận thức được vấn đề nếu bạn muốn sử dụng tính toán goto
s trong buổi hòa nhạc với các đối tượng với các destructors không tầm thường.
Nguồn
2013-04-10 17:14:55
Tại sao bạn cần biết điều này? 'goto' có ý nghĩa trong mã được tạo ra, nhưng ở đó bạn có thể và nên tránh các đối tượng với destructors anyway. – MSalters
@MSalters: mà doesnt làm cho sence ở tất cả, tại sao bạn nên tránh các đối tượng với destructors? –
@Viktor: Hãy để tôi mở rộng phần thứ hai của câu: _In create code_, bạn có thể và nên tránh các đối tượng với destructors anyway. Việc sử dụng kinh điển của 'goto' là trong mã FSM được tạo. Ở đây nhảy xảy ra ngược và tiến, mà không quan tâm đến các trạng thái mã trạng thái chỉ xảy ra ở giữa. Các trạng thái FSM không đơn giản là tuyến tính, nhưng phải có mã C++. – MSalters