Was ist, wenn ich folgendes habe:
%Vor% Natürlich werde ich nur einen der drei Vektoren verwenden. Aber ... was passiert, wenn alle 3 Vektoren konstruiert sind?
Würden sich die Konstruktoren der 3 Vektoren gegenseitig stören? (da die 3 von ihnen in der gleichen Speicheradresse sind)
Danke.
Der aktuelle C ++ - Standard erlaubt keine Nicht-POD-Typen innerhalb von Unionen. Sie erhalten diesen Compilerfehler von gcc
:
Neuer C ++ - Standard ( C ++ 0x ) schlägt uneingeschränkte Gewerkschaften , aber es fügt C ++ noch weitere Objektlebensdauerfehler hinzu.
Sie können keine Unionen mit Nicht-POD-Klassentypen haben. Ihre Probe wird nicht kompiliert.
Sie können boost::variant
als sichere Alternative zu C-Unionen verwenden. Siehe die Dokumentation auf boost.org . Sie könnten jedoch Ihr Design überdenken und stattdessen Polymorphismus verwenden. Das hängt natürlich davon ab, was Sie erreichen wollen.
Aus dem C ++ Standard, Abschnitt 9.5:
Ein Objekt einer Klasse mit einem nicht-trivialer Konstruktor (12.1), a nicht-trivialer Copy-Konstruktor (12.8), a nicht-trivialer Destruktor (12.4), oder a nicht-triviale Kopierzuweisungsoperator (13.5.3, 12.8) kann kein Mitglied eines sein Vereinigung,
Hier, für "nicht-trivial" lesen Sie "nützlich": -)
Würden sich die Konstruktoren der 3 Vektoren gegenseitig stören? (da die 3 von ihnen in der gleichen Speicheradresse sind)
Der C ++ - Standard lässt Ihr Programm nicht zu, so ist es (bestenfalls!) implementierungsdefiniert was passiert.
Wenn beispielsweise Ihre Implementierung alle drei Standardkonstruktoren aufruft und diese alle Speicher zuordnen und den Zeiger auf den neu zugewiesenen Speicherbereich speichern, haben Sie ein Speicherleck (die ersten Zwei Zuweisungen werden von der dritten überschrieben) / p>
Wenn die Destruktoren alle aufgerufen werden und sie alle "ihre" Erinnerung freigeben, machen Sie eine doppelte Freiheit (dreifach, auc); Dies wird wahrscheinlich die Zuordnungsdatenstruktur beschädigen, was eine schlechte Sache ist. Sei glücklich, wenn du abstürzt, weil es viel schwieriger zu debuggen ist, wenn du es nicht tust.
Ich denke, diese Probleme könnten sein, warum der Standard dies nicht zulässt.
(Eine etwas sensiblere Sache könnte sein, nur die erste Klasse standardmäßig zu konstruieren, aber das ist immer noch nicht sensibel, nur weniger verrückt ...)
Vielleicht möchten Sie sich auch Boost.Variant ansehen, die dies können enthält einen einzelnen Wert verschiedener Typen.