Tôi đang cố gắng sử dụng một liên minh (C++) có một số biến không nguyên thủy, nhưng tôi đang cố gắng tạo ra destructor cho lớp đó. Như tôi đã đọc, không thể đoán biến nào của union được sử dụng nên không có destructor ngầm, và khi tôi sử dụng union này trên stack, các lỗi biên dịch mà destructor bị xóa. Các công đoàn như sau:Làm thế nào để viết destructor cho lớp giống như công đoàn
struct LuaVariant {
LuaVariant() : type(VARIANT_NONE) { }
LuaVariantType_t type;
union {
std::string text;
Position pos;
uint32_t number;
};
};
Biến type
giữ những gì lĩnh vực công đoàn đang được sử dụng (được lựa chọn từ một enum), với mục đích đọc từ công đoàn và nó có thể được sử dụng để đoán giá trị gì nên bị xóa. Tôi đã thử một số cách tiếp cận khác nhau nhưng không ai trong số họ làm việc. Trước hết, chỉ cần thử phá hủy mặc định:
~LuaVariant() = default;
Nó không hoạt động, như mặc định là ... xóa. Vì vậy, tôi đã cố gắng trao đổi các giá trị với một một sản phẩm nào, do đó nội dung sẽ bị xóa và sẽ không có vấn đề "rò rỉ" một giá trị rỗng:
~LuaVariant() {
switch (type) {
case VARIANT_POSITION:
case VARIANT_TARGETPOSITION: {
Position p;
std::swap(p, pos);
break;
}
case VARIANT_STRING: {
std::string s;
std::swap(s, text);
break;
}
default:
number = 0;
break;
}
};
Nhưng như tôi không phải là một bậc thầy của các đoàn thể, Tôi không biết nếu điều đó có thể gây ra vấn đề khác, chẳng hạn như bộ nhớ được phân bổ mà không bao giờ bị deallocated, hoặc một cái gì đó như thế. Chiến lược hoán đổi này có thể được sử dụng mà không có sai sót và các vấn đề?
Thay vì lừa swap của bạn, bạn cần phải gọi một cách rõ ràng destructor. Mã của bạn không gọi destructors cho đối tượng trong union. Điều này có lẽ chỉ là một rò rỉ tài nguyên chứ không phải là UB, nhưng giải pháp sạch và chính xác nhất là gọi destructors. –
* lớp giống công đoàn * là thuật ngữ Chuẩn cho một 'union', hoặc một lớp/struct chứa một liên kết ẩn danh. –