Действительно ли возможно соединить несколько объектов в объединении?

Что, если у меня есть это:

union{
    vector<int> intVec ;
    vector<float> floatVec ;
    vector<double> doubleVec ;
} ;

Конечно, я буду использовать только один из этих 3 векторов. Но... что происходит, когда все эти 3 вектора создаются??
Был бы consructors этих 3 векторов вмешиваться друг в друга?? (так как 3 из них находятся в том же адресе памяти),

Спасибо.

11
задан timrau 15 August 2012 в 00:02
поделиться

5 ответов

Текущий стандарт C ++ не допускает типы не POD внутри объединений. Вы получите эту ошибку компилятора из gcc :

error: member ‘std::vector<int, std::allocator<int> >
<anonymous union>::i’ with constructor not allowed in union
error: member ‘std::vector<int, std::allocator<int> >
<anonymous union>::i’ with destructor not allowed in union

Новый стандарт C ++ ( C ++ 0x ) предлагает неограниченные объединения , но он добавляет еще Подробнее ловушки времени жизни объекта для C ++ .

16
ответ дан 3 December 2019 в 02:41
поделиться

Из стандарта C ++, раздел 9.5:

Объект класса с нетривиальный конструктор (12.1), а нетривиальный конструктор копирования (12.8), нетривиальный деструктор (12.4) или нетривиальный оператор присваивания копии (13.5.3, 12.8) не может быть членом union,

Здесь для «нетривиального» читайте «полезный»: -)

2
ответ дан 3 December 2019 в 02:41
поделиться

У вас не может быть объединений, содержащих типы классов не POD. Ваш пример не скомпилируется.

Вы можете использовать boost :: variable в качестве безопасной альтернативы союзам C. См. Документацию на boost.org . Однако вы можете пересмотреть свой дизайн и использовать вместо этого полиморфизм. Конечно, зависит от того, чего вы пытаетесь достичь.

9
ответ дан 3 December 2019 в 02:41
поделиться

Могут ли конструкторы трех векторов мешать друг другу? (поскольку 3 из них находятся в одном и том же адресе памяти)

Стандарт C ++ не разрешает вашу программу, поэтому он (в лучшем случае!) определяет реализацию, что происходит.

Если, скажем, ваша реализация вызывает все три конструктора по умолчанию, и все они выделяют память и хранят указатель на вновь выделенное пространство, в результате возникает утечка памяти (первые два выделения перезаписываются третьим).

Если все деструкторы вызываются и все они освободив «свою» память, вы будете делать двойное освобождение (тройное, актуально); это может повредить структуру данных распределения, что является плохой вещью. Будьте счастливы, если рухнете, потому что отладить намного сложнее, если вы этого не сделаете.

2
ответ дан 3 December 2019 в 02:41
поделиться

Возможно, вы захотите взглянуть на Boost.Variant , который может содержать одно значение: разные типы.

1
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: