Nó sẽ không làm rò rỉ đối tượng bạn đang xóa, khối bộ nhớ của nó sẽ được giải phóng.
Nếu bạn chưa tuyên bố destructor trong base_class
là ảo sau đó nó sẽ rò rỉ bất kỳ đối tượng được cấp phát động chứa trong derived_class
mà dựa vào destructor của derived_class
được gọi để giải phóng họ. Điều này là bởi vì nếu destructor không phải là ảo, các derived_class
destructor không được gọi là trong trường hợp này. Nó cũng có nghĩa là các destructor của "các đối tượng nhúng" trong phạm vi derived_class
sẽ không tự động được gọi, một vấn đề riêng biệt nhưng bổ sung, có thể dẫn đến rò rỉ hơn và không thực thi mã dọn dẹp quan trọng.
Tóm lại, hãy tuyên bố trình phá hủy trong base_class
là ảo và bạn có thể sử dụng kỹ thuật này một cách an toàn mà bạn đã trình bày.
Đối với một ví dụ mã, xem:
In what kind of situation, c++ destructor will not be called?
Mã sẽ không biên dịch. Tôi khuyên bạn nên vượt qua nó thông qua một trình biên dịch đầu tiên. Tốt hơn sẽ là: 'base_class * ptr = new derived_class();' –
Nếu 'base_class' không có một destructor ảo, nó sẽ kích hoạt hành vi không xác định (§5.3.5/p3) –