2012-01-07 33 views
7

Tôi đã hai lớp, base_class và derived_class và đoạn mã sau:Xóa một đối tượng có nguồn gốc thông qua một con trỏ tới lớp cơ sở của nó

base_class *ptr = new derived_class; 
delete ptr; 

sẽ mã này tạo ra một rò rỉ bộ nhớ? Nếu vậy, làm thế nào tôi nên đối phó với nó?

+1

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();' –

+3

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) –

Trả lời

21

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?

+0

cảm ơn bạn, điều này trả lời các mối quan tâm của tôi –

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