2010-04-09 29 views
8

C++ tự động gọi destructors của tất cả các biến cục bộ trong khối theo thứ tự ngược bất kể khối đó có bị thoát bình thường không (điều khiển rơi qua) hoặc một ngoại lệ được ném.Làm thế nào là phá hủy các biến cục bộ khi một khối được thoát thường được gọi trong C++?

Có vẻ như cụm từ stack unwinding chỉ áp dụng cho cụm từ sau. Làm thế nào là quá trình cũ (lối ra bình thường của khối) được gọi là liên quan đến phá hủy các biến địa phương?

+1

Nó thực sự không được gọi là bất cứ điều gì. Ở mọi nơi trong tiêu chuẩn, nó nói những thứ như "... biến tự động bị phá hủy ở cuối khối". Nó không bao giờ mang lại cho một quá trình đó một cái tên. – GManNickG

+0

@GMan - Lưu kỳ lân: Tôi đoán bạn có thể thêm câu trả lời này làm câu trả lời. Đề cập đến những gì The Standard nói là một lập luận mạnh mẽ. – sharptooth

Trả lời

5

Một đối tượng được tự động hủy khi nó "nằm ngoài phạm vi". Điều này có thể được gọi là "cải tạo lưu trữ tự động", nhưng thực sự đề cập đến việc thu gom rác thải (có một số giấy tờ với cụm từ đó trong tên của họ sử dụng thuật ngữ để thu gom rác). Khi nó được sử dụng để đảm bảo ghép nối thích hợp mở/đóng, khóa/mở khóa hoặc các hình thức mua lại tài nguyên khác với bản phát hành thích hợp của chúng, thì nó được gọi là mẫu thiết kế Resource Acquisition is Initialization (RAII), có phần mỉa mai cho rằng khía cạnh chính của RAII không phải là khởi tạo hoặc mua lại tài nguyên, mà là sự hủy diệt tài nguyên.

2

Biến cục bộ bị phá hủy khi biến mất trong phạm vi. Có lẽ quá trình này được gọi là "đi ra khỏi phạm vi"?

1

Tôi không chắc chắn có tên cho điều này. Các biến ngăn xếp là vì vậy tự động mà không ai lo lắng về chúng, bao giờ, thậm chí không đủ để đặt tên cho quy trình dọn dẹp tự động này.

Gọi nó là "nằm ngoài phạm vi", tôi đoán vậy.

1

Tôi luôn nghe nói rằng "không nằm ngoài phạm vi" hoặc chính xác hơn "biến số auto biến mất trong phạm vi".

1

Nếu bạn đang muốn hỏi là cách gọi phương thức được thực sự thực hiện trong mã máy, tôi sẽ nói nó sẽ phụ thuộc vào quy ước gọi được sử dụng

3

stack ươm xảy ra trong cả hai trường hợp, nó chỉ là dưới bình thường thực hiện ngăn xếp là unwound chỉ đến bối cảnh của phương thức gọi (hoặc khối) khi phương thức thực hiện trả về (hoặc khối được thoát). Các biến cục bộ được cấp phát trên ngăn xếp, do đó chúng được làm sạch theo thứ tự phân bổ ngược lại, và đó là quá trình này được gọi là thư giãn. Nó không khác với việc xử lý bất kỳ loại dữ liệu nào khác mà bạn muốn lưu trữ trong cấu trúc LIFO - ví dụ: hoàn tác, làm lại.

Khi ngoại lệ được ném, trình xử lý sẽ giải phóng ngăn xếp thông qua không hoặc nhiều phương thức cho đến khi tìm thấy một phương thức có thể bắt ngoại lệ hoặc cho đến khi nó đạt đến đỉnh của ngăn xếp, lúc đó trình xử lý ngoại lệ không được xử lý sẽ là gọi là.

Dường như là quy ước chỉ sử dụng thuật ngữ ngăn xếp thư giãn trong trường hợp xử lý ngoại lệ, nhưng nó cũng là quá trình tương tự xảy ra trong mỗi trường hợp này. Trường hợp cụ thể mà ngăn xếp thư giãn do một phương thức thoát được gọi là trả về, dường như không có bất kỳ quy ước nào để đặt tên cho những gì xảy ra khi một khối mã bị cắt bỏ.

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