Tôi đã nhận được một số mã C++ với các cấu trúc khác nhau được định nghĩa như thế này:Đây có phải là C++ destructor thừa không?
typedef struct _someStruct_ {
std::string someString;
std::vector<std::string> someVectorOfStrings;
int someOtherStuff;
~_someStruct_()
{
someString.clear();
someVectorOfStrings.clear();
}
} someStruct;
là destructor đây hoàn toàn không cần thiết - nếu cấu trúc đã được destructed bởi destructor mặc định, sẽ không bất kỳ chuỗi, vectơ, vv vẫn bị phá hủy?
Nếu tôi viết mã, tôi sẽ không nghĩ đến việc thêm một trình phá hoại rõ ràng ở đây - tôi chỉ để trình biên dịch tiếp tục với nó. Khi tôi hiểu nó, thời gian duy nhất bạn có thể cần để tạo ra destructor của riêng bạn trong cấu trúc là nếu bất kỳ thành viên nào của cấu trúc chứa con trỏ đến dữ liệu có thể cần dọn dẹp, hoặc nếu một số chức năng bổ sung (vd gỡ lỗi, đăng nhập khi một cấu trúc bị xóa) là cần thiết.
Tôi có thiếu thứ gì đó ở đây không - có lý do nào tại sao chuỗi và vectơ đã được xóa rõ ràng trong trình hủy không? Nghi ngờ của tôi là người đã gửi cho tôi điều này thực sự là một lập trình viên C (xem typedef), người đã cố gắng biến một số mã C thành C++.
Có, nó hoàn toàn vô dụng. Tuy nhiên, nếu vectơ đã được giữ nguyên con trỏ bạn phải gọi xóa mình trên mỗi con trỏ (tại thời điểm đó bạn nên sử dụng con trỏ thông minh). – Borgleader
miễn là các destructors của các thành viên làm những gì là cần thiết, không có nhu cầu cho một destructor tùy chỉnh. –
'typedef _someStruct_ {...} someStruct;' cũng hoàn toàn thừa, chỉ cần viết 'struct someStruct {...};'. Vì kiểu không thể hợp lệ trong một chương trình C (vì nó sử dụng một destructor) nên không có lý do gì để sử dụng một typedef cho tên struct. –