Frage

Ich habe folgendes Szenario

class foo
{
  ...
  private:
   char *_test;
};

void foo::setTest()
{
  if( 0 != _test ) delete [] _test;
}

Die Funktion setTest wirft einen Fehler, wenn sie aufgerufen, wie es versucht, _test zu löschen, wenn sie noch nicht zugeordnet wurde. Dies geschieht, weil _test nicht auf 0x0 gesetzt.

Kann jemand mir helfen, dies zu verstehen?

War es hilfreich?

Lösung

Sie sollten mit NULL im Konstruktor initialisieren _test.

Wie:

foo:foo {
 _test = NULL;
}

Wenn Sie nicht _test wird Müll Wert haben.

Auch als spitzer von Chris, der übergebene Wert als Argument delete oder (delete[]) muss entweder ein Zeiger auf einen Speicherblock sein, der zuvor mit new zugeordnet oder ein Nullzeiger ( in dem Fall eines Null-Zeigers, löschen keinen Effekt ), effektiv Ihre NULL Prüfung überflüssig zu machen.

Andere Tipps

Nun, wenn _test hat keinen Wert zugewiesen wurde, dann hat es nicht definierten Wert. Sie können diesen Wert nicht für etwas verwenden, wenn Sie gesund Verhalten wollen. Variablen müssen zugewiesen werden, bevor sie verwendet werden.

Im Übrigen delete und delete[] sicher ist, auf Null-Zeiger zu nennen, so dass die == 0 Check redundant ist.

Es gibt zwei Möglichkeiten:

Wenn Sie noch nie initialize foo::_test, dann wird diese Variable wahrscheinlich Zufallsdaten enthalten, wenn Ihre Klasse konstruiert. C ++ nicht Ihren Zeiger auf null initialisiert werden (im Gegensatz zu Java, C #, oder die meisten anderen höheren Sprachen). Sie sollten immer (immer!) Initialisieren Ihre Zeiger auf NULL oder einen gültigen Wert. Wechseln Sie in char *_test = NULL; oder anderweitig initialize _test in Ihrem Konstruktor.

Alternativ ist es möglich, dass _test an einem anderen Ort in der Probe nicht gezeigt wird gelöscht wird, aber sein Satz NULL nicht. Jedes Mal, wenn Sie einen Teilnehmer löschen, sollten Sie setzen darauf, um NULL diese Art von Doppelfreien Problem zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top