khi nào/tại sao tôi nên sử dụng trình phá hủy ảo?
Thực hiện theo Herb Sutters guideline:
Một cơ sở lớp destructor nên là công khai và ảo, hoặc bảo vệ và nonvirtual
này có thể được phân loại như là một hành vi không xác định (chúng tôi nhận thức được rằng ~ D() sẽ không được gọi là chắc chắn)?
Hành vi không xác định theo tiêu chuẩn, thường dẫn đến phá hủy lớp có nguồn gốc và không dẫn đến rò rỉ bộ nhớ, nhưng không thích hợp để suy đoán sau khi có hành vi không xác định vì tiêu chuẩn không gaurantee bất cứ điều gì về vấn đề này.
C++ 03 Tiêu chuẩn: 5.3.5 Xóa
5.3.5/1:
Nhà điều hành xóa biểu hiện phá hủy một đối tượng có nguồn gốc nhất (1.8) hoặc mảng tạo bằng một biểu thức mới.
xóa biểu hiện:
:: chọn xóa đúc biểu
:: chọn delete [] đúc thể hiện
5.3.5/3:
Trong lần đầu tiên thay thế (xóa đối tượng), nếu kiểu tĩnh của toán hạng khác với kiểu động của nó, kiểu tĩnh phải là một lớp cơ sở của kiểu động của toán hạng và kiểu tĩnh sẽ có một destructor ảo hoặc hành vi là không xác định. Trong phương án thứ hai (xóa mảng) nếu loại năng động của các đối tượng được xóa khác với kiểu tĩnh của nó, hành vi này là undefined.73)
gì nếu ~D()
trống. Nó có ảnh hưởng đến mã theo bất kỳ cách nào không?
Vẫn là hành vi không xác định theo tiêu chuẩn, Trình dẫn lớp dẫn xuất bị trống có thể làm cho chương trình của bạn hoạt động bình thường nhưng đó lại là khía cạnh thực hiện được xác định của một triển khai cụ thể, về mặt kỹ thuật, nó vẫn là hành vi không xác định.
Lưu ý rằng không có gaurantee ở đây mà không làm cho lớp dẫn xuất destructor ảo chỉ không dẫn đến cuộc gọi đến lớp dẫn xuất destructor và giả định này là không chính xác. Theo tiêu chuẩn, tất cả các phiên cược sẽ bị loại khi bạn bị vượt qua trong khu vực Hành vi Không xác định.
Lưu ý những gì anh ấy nói tiêu chuẩn về Hành vi không xác định.
C++ 03 Tiêu chuẩn: 1.3.12 hành vi undefined [defns.undefined]
hành vi, chẳng hạn như có thể phát sinh khi sử dụng một cấu trúc chương trình có sai sót hoặc dữ liệu sai sót, mà quốc tế này Tiêu chuẩn không áp đặt yêu cầu.Hành vi không xác định cũng có thể được mong đợi khi Tiêu chuẩn này loại bỏ mô tả về bất kỳ định nghĩa hành vi rõ ràng nào. [Lưu ý: phạm vi hành vi không xác định được cho phép từ bỏ hoàn toàn tình huống với kết quả không thể đoán trước, hoạt động trong khi thực hiện dịch hoặc thực hiện chương trình theo đặc tính của môi trường (có hoặc không có thông báo chẩn đoán) để chấm dứt bản dịch hoặc thực hiện (với việc phát hành một thông báo chẩn đoán). Nhiều cấu trúc chương trình sai lầm không tạo ra hành vi không xác định; họ được yêu cầu được chẩn đoán.]
Nếu chỉ destructor có nguồn gốc sẽ không được gọi là điều chỉnh bởi văn bản in đậm trong báo giá ở trên, rõ ràng là trái mở cho mỗi thực hiện.
Tôi thường nghĩ đến việc yêu cầu điều tương tự. Tôi muốn một câu trả lời toàn diện xem xét ba trường hợp: (1) B không có phương pháp ảo, (2) B có một phương pháp ảo, nhưng một destructor không ảo, (3). B có một destructor ảo. Rõ ràng, chỉ sau này được xác định rõ: http://stackoverflow.com/questions/2065938/virtual-destructor –
Đây là răng của tôi :) – mlvljr