2012-04-18 41 views
60

Trong C++, nếu một hàm tạo ném một ngoại lệ, thì các trình phá hủy nào đang chạy?Những gì destructors được chạy khi constructor ném một ngoại lệ?

Cụ thể, nó có tạo nên sự khác biệt nào nếu ngoại lệ nằm trong danh sách khởi tạo hoặc nội dung không?

Ngoài ra, còn thừa kế và thành viên thì sao? Có lẽ tất cả các công trình xây dựng hoàn thành đều bị phá hủy. Nếu chỉ có một số thành viên được xây dựng, thì chỉ những thành viên mới bị phá hủy? Nếu có nhiều thừa kế, tất cả các nhà xây dựng đã hoàn thành có bị hủy không? Liệu thừa kế ảo có thay đổi gì không?

+2

Có lý do nào khiến bạn không tự mình thử nghiệm điều này không? –

+23

@Steve: Bởi vì dựa vào hành vi của một phiên bản trình biên dịch cụ thể là một ý tưởng khủng khiếp nếu bạn muốn mã di động hoặc có thể duy trì. –

+0

@BenVoigt - Tôi đồng ý về mặt lý thuyết. Nhưng khi bạn đang viết mã trong thế giới thực, bạn phải đối phó với thực tế. Và tôi sẽ vô cùng ngạc nhiên nếu tất cả các trình biên dịch chính không có được quyền này. –

Trả lời

57

nếu một nhà xây dựng đưa ra ngoại lệ, những gì trình phá hủy được chạy?

Cấu trúc của tất cả các đối tượng được tạo hoàn toàn trong phạm vi đó.

Điều đó có tạo nên sự khác biệt nào nếu ngoại lệ nằm trong danh sách khởi tạo hoặc nội dung không?

Tất cả các đối tượng đã hoàn thành sẽ bị hủy.
Nếu hàm tạo không bao giờ được gọi là đối tượng hoàn toàn không bao giờ được xây dựng và do đó không thể bị hủy.

Còn thừa kế và thành viên thì sao? Có lẽ tất cả các công trình xây dựng hoàn thành đều bị phá hủy. Nếu chỉ có một số thành viên được xây dựng, thì chỉ những thành viên mới bị phá hủy? Nếu có nhiều thừa kế, tất cả các nhà xây dựng đã hoàn thành có bị hủy không? Liệu thừa kế ảo có thay đổi gì không?

Tất cả các công trình hoàn thành sẽ bị hủy. Có, chỉ các đối tượng được tạo hoàn toàn mới bị hủy.

Tốt đọc:

Constructor Failures by Herb Sutter

Đặc biệt, tình yêu là một phần trong đó ông giải thích:

Về sinh học, quan niệm đã diễn ra - các nhà xây dựng đã bắt đầu - nhưng dù những nỗ lực tốt nhất nó đã được theo sau bởi một sẩy thai - các nhà xây dựng không bao giờ chạy đến hạn (ination).

Ngẫu nhiên, đây là lý do tại sao một destructor sẽ không bao giờ được gọi nếu các nhà xây dựng đã không thành công - không có gì để tiêu diệt. "Nó không thể chết, vì nó không bao giờ sống." Lưu ý rằng điều này làm cho cụm từ "một đối tượng có hàm tạo đã ném một ngoại lệ" thực sự là một oxymoron. Một thứ như vậy thậm chí còn ít hơn một đối tượng cũ ... nó chưa bao giờ sống, chưa bao giờ, chưa bao giờ thở đầu tiên.

+0

Điều gì trên trái đất là "phạm vi hợp lý"? –

+1

Bạn cũng có thể muốn đọc @ Als's [câu trả lời trước đó] (http://stackoverflow.com/a/9972063/179910) về cùng một chủ đề. –

4

Bất kỳ đối tượng nào được tạo trong phạm vi địa phương còn lại do hàm tạo sẽ bị hủy. Xử lý thời gian chạy đi ngược lại ngăn xếp, gọi các trình phá hủy, cho đến khi nó tìm thấy một trình xử lý.

Nếu ngoại lệ được ném từ một hàm tạo, các trình phá hủy của tất cả các lớp con được xây dựng hoàn toàn hoàn toàn sẽ được gọi. Ngoài ra, nếu hàm tạo là một phần của biểu thức new, thì vị trí thích hợp toán tử xóa sẽ được gọi nếu nó tồn tại.

+0

+1 để mô tả những gì xảy ra với các biểu thức mới. Cái này quan trọng. –

14

Trong C++, nếu một hàm tạo ném một ngoại lệ, thì trình phá hủy nào đang chạy?

Tất cả các đối tượng đã chạy để hoàn thành.

Cụ thể, liệu có khác biệt gì không nếu ngoại lệ nằm trong danh sách khởi tạo hoặc nội dung?

Không. Tất cả các thành viên được xây dựng hoàn chỉnh trước trường hợp ngoại lệ sẽ có hoạt động hủy của họ. Thành viên đã ném trong khi xây dựng và tất cả các thành viên không được xây dựng khác sẽ không phải có hoạt động phá hủy của họ. Thứ tự xây dựng thành viên cũng được xác định và do đó bạn biết chính xác những gì sẽ xảy ra cho bạn biết điểm ném ngoại lệ.

Ngoài ra, còn thừa kế và thành viên thì sao?

Áp dụng cùng một quy tắc.

Có lẽ tất cả các công trình hoàn thành sẽ bị hủy.

Nếu chỉ có một số thành viên được xây dựng, đừng chỉ những có được destructed?

Nếu có đa kế thừa, làm tất cả các nhà xây dựng đã hoàn thành được destructed?

Liệu thừa kế ảo thay đổi bất cứ điều gì?

No.
Nhưng lưu ý: Thừa kế ảo ảnh hưởng đến thứ tự nhà thầu được gọi. Nếu bạn không quen thuộc với cách thứ tự được xác định này có thể không trực quan cho đến khi bạn tìm kiếm các quy tắc chính xác.

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