Vererbung
-
Hi,
ich hab da eine Klasse, die von CObject abgeleitet ist. Die hat als Membervariable einen Zeiger mit dem Namen: CMyCombo* m_pCombo.
Von dieser Klasse abgeleitet ist eine andere Klasse dieeine Membervariable hat:
CDebiCombo* m_pCombo;Ärger gibt es mit den Destruktoren. Der Destruktor der Basisklasse stürzt regelmäßig ab, wenn er zu der Stelle kommt.
delete m_pButton; m_pButton=NULL; if( m_pCombo!=(CMyCombo*)0xcdcdcdcd && m_pCombo!=NULL) { delete m_pCombo; m_pCombo=NULL; } if( m_pEdit!=(CMyEdit*)0xcdcdcdcd && m_pEdit!=NULL) { delete m_pEdit; m_pEdit=NULL; }
Aber:::
nicht immer und das ganze nur in der Releaseversion.
Dazu sollte man noch sagen, dass auch die abgeleitete Klasse das m_pCombo zerstört.Wo ist das Problem???
-
jens444 schrieb:
Wo ist das Problem???
Der Test auf 0xcdcdcdcd (woher hast du das eigentlich?) riecht verdächtig nach Symptombehandlung. Ist dir klar, dass das ein Wert ist, mit dem der Compiler uninitialisierte Zeiger füllt, aber nur in der Debugkonfiguration?
Initialisier deine Zeiger ordentlich, dann brauchst du auch solche kruden Tests nicht. Die Prüfung auf NULL ist ja sowieso überflüssig.
-
Das Problem dürfte sein, dass die Variable doppelt existiert.
Einmal als MyCombo und einmal als Debi...Am einfachsten wäre wohl, wenn du sie anders nennst.
-
Hi,
zu MFK: Wie aus dem Destruktor ersichtlich kann die Klasse sowohl ein m_pEdit als auch ein m_pCombo haben, und das abwechselnd, also entweder m_pCombo oder m_pEdit.
Eins ist initialisiert, eins ist NULL, daher die Abfrage im Destruktor. Ich initialisiere zu NULL, aber es erscheinen dann später andere Werte. Dann versucht der Destruktor etwas zu zerstören, was nicht existiert und es gibt einen Absturz.zu Estartu: Ich hab gemacht, was du vorgeschlagen hast, das Problem besteht aber immer noch, s.o..
Danke erstmal, es wäre aber schön, noch weitere Ratschläge zu hören
.
-
jens444 schrieb:
Eins ist initialisiert, eins ist NULL, daher die Abfrage im Destruktor.
Da delete bei einem Nullzeiger nichts bewirkt, kannst du dir die Abfrage auf != NULL sparen.
Ich initialisiere zu NULL, aber es erscheinen dann später andere Werte.
Dann hast du einen Bug in deinem Programm. Nirgendwo sollten "andere Werte" einfach so "erscheinen". Du solltest diesen Bug beheben und nicht die Symptome. Du kannst am Wert eines Zeigers nicht erkennen, ob er auf bereits freigegebenen Speicher zeigt.
-
Hi,
ich hab das Problem auch dank eurer anregungen jetzt erstmal gelöst, indem ich folgendes gemacht habe.CSuperItem::~CSuperItem() { delete m_pButton; m_pButton=NULL; switch(m_sType) { case STATCOMBOTEXT: case STATCOMBONUMBER: case STATCOMBODATE: delete m_pCombo; m_pCombo=NULL; break; case STATEDITTEXT: case STATEDITNUMBER: case STATEDITDATE: delete m_pCombo; m_pCombo=NULL; break; default: break; } }
Wunderbar. Vielen Dank noxchmals.