Próbuję użyć unii (C++), która ma pewne zmienne nieprymujące, ale utknąłem próbując utworzyć destruktor dla tej klasy. Jak już przeczytałem, nie można zgadnąć, jaka zmienna związku jest używana, więc nie ma niejawnego destruktora, a ponieważ używam tego związku na stosie, błędy kompilatora, który usuwa destruktor. Unia jest w następujący sposób:Jak pisać destruktor dla klasy podobnej do unii
struct LuaVariant {
LuaVariant() : type(VARIANT_NONE) { }
LuaVariantType_t type;
union {
std::string text;
Position pos;
uint32_t number;
};
};
Zmienna type
posiada co pole unii jest używany (wybrany z wyliczenia), w celu odczytu z unii i może być używany do odgadnąć, co wartość powinna być usunięte. Próbowałem różnych podejść, ale żaden z nich nie działał. Po pierwsze, po prostu wypróbowałem domyślny destruktor:
~LuaVariant() = default;
To nie działało, ponieważ domyślnie jest ... usunięte. Tak, próbowałem zamianę wartości z pustym drugim, tak że zawartość zostanie skasowana i nie byłoby problemu „przecieka” pusty wartość:
~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;
}
};
Ale nie jestem mistrzem związkami, Nie wiem, czy może to spowodować inne problemy, takie jak przydzielona pamięć, która nigdy nie zostanie zwolniona, czy coś w tym stylu. Czy ta strategia wymiany może być używana bez wad i problemów?
zamiast swojego wymiany sztuczki, trzeba jawnie wywołać destruktor. Twój kod nie wywołuje destruktorów obiektu w unii. Jest to prawdopodobnie tylko wyciek zasobów, a nie UB, ale najczystszym i właściwym rozwiązaniem jest wywołanie destruktorów. –
* klasa podobna do unii * jest terminem standardowym dla "union" lub klasy/struct zawierającej anonimowy union. –