Vererben von leerer Basisklasse - Problem mit VC6
-
Ich habe in komisches Problem mit VC6: Im Debug-Build überschreibt VC Speicher von fremden Variablen, im Release-Build scheint es dieses Problem nicht zu geben.
#include <iostream> using namespace std; class empty { }; class c1 { int dummy; }; class c2 : public empty { public: c2(const empty& c) : empty(c) {} }; class c3 : public c1, public c2 { public: c3(const empty& c = empty()) : c2(c) {} }; int main() { int davor = 0; c3 c; int danach = 0; cout << "sizeof(c1) = " << sizeof(c1) << endl; cout << "sizeof(c2) = " << sizeof(c2) << endl; cout << "sizeof(c3) = " << sizeof(c3) << endl; cout << "&c1 = " << &static_cast<c1&>(c) << endl; cout << "&c2 = " << &static_cast<c2&>(c) << endl; cout << "&c3 = " << &static_cast<c3&>(c) << endl; cout << "&davor = " << &davor << " (" << davor << ")" << endl; cout << "&danach = " << &danach << " (" << danach << ")" << endl; cout << "\"davor\" wurde " << (davor == 0 ? "nicht " : "") << "veraendert" << endl; cout << "\"danach\" wurde " << (danach == 0 ? "nicht " : "") << "veraendert" << endl; cout << "\"davor\" und \"c2\" haben " << ((void*)&static_cast<c2&>(c) != (void*)&davor ? "nicht " : "") << "dieselbe Adresse" << endl; return 0; }
Wenn ich das nun im Debug-Modus laufen lasse, erhalte ich
sizeof(c1) = 4 sizeof(c2) = 1 sizeof(c3) = 4 &c1 = 0012FF68 &c2 = 0012FF6C &c3 = 0012FF68 &davor = 0012FF6C (204) &danach = 0012FF64 (0) "davor" wurde veraendert "danach" wurde nicht veraendert "davor" und "c2" haben dieselbe Adresse
Das Problem tritt auch nur dann auf, wenn die leere Basisklasse über den copy-ctor initialisiert wird (im "echten" Code wird die Basisklasse durch einen template-Parameter bestimmt und muss daher initialisiert werden, auch wenn es in den meisten Fällen bei einer leeren Klasse bleiben wird)
Was ist da los? Wie lässt sich das am besten beheben? Kann mir jemand bestätigen, dass das Problem im Release-Build unter keinen Umständen auftreten kann und es bei mir nicht nur zufällig funktionierte?
-
empty besitzt einen copyconstruktor ?
(in Codeform, nicht in compilierter form)Devil
-
Im Code nicht, nein (Ersetze in Gedanken "empty" durch "std::less<T>" ;))
Konkrete Situation ist, dass ich FnDispatcher aus der Loki-Lib zusammen mit StlPort 4.6 anwenden wollte, ich dann aber auf dieses Problem gestoßen bin, und es bis zu obigem Beispiel vereinfachen konnte.
-
Hat wirklich niemand eine Idee?
-
tag schrieb:
Hat wirklich niemand eine Idee?
Das ist ein Bug des VCs. Definiere mal in empty einen Standard-Ctor sowie einen Copy-Ctor. Das sollte das Problem beheben.
class empty { public: empty() {} empty(const empty& c) {} };
-
Jepp, das hilft, danke
Jetzt stellt sich nur noch die Frage, wie ich das am besten integriere, sprich welche Bibliothek ich umbaue...Was mir eben gerade aufgefallen ist: Wenn ich die Generierung der Debug-Informationen von "Programmdatenbank für Bearbeiten und Fortfahren" auf "Programmdatenbank" umstelle, dann wird nichts überschrieben. Vielleicht reicht das ja schon aus.