Löschen Speicherfehler
-
24-09-2019 - |
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?
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.