2016-08-21 3 views
-5

Gibt es eine Möglichkeit, den von *data in diesem Code verwendeten Speicher freizugeben?Kann ein neues [] * Zeichen gelöscht werden [] (ed)?

Der Code stürzt beim Löschen ab, da "UNBEKANNT" nicht gelöscht werden kann.

+5

Sie müssen mehr Compiler-Warnungen ermöglichen und bessere Lernmaterial zu bekommen. –

+7

Sie verwenden _not_ 'strcpy()' nicht, um ein 'char *' zu löschen! (Zu einer Zeit hieß es: _ [Ich] bin mir der Tatsache bewusst, dass, um einfach ein '* char 'zu löschen, ich' strcpy'_) verwenden muss –

+0

Versuchen Sie, 'std :: string' zu verwenden Leben viel einfacher – JVApen

Antwort

2

Ihr Problem liegt in dem folgenden Code:

data = new char[length]; 
data = "UNKNOWN"; 

Zunächst erstellen Sie einen neuen char-Array, in der nächsten Anweisung, verlieren Sie den einzigen Ankerpunkt, um es, indem sie sie überschreiben mit der Adresse die literale Zeichenfolge "UNKNOWN", die in der ausführbaren Datei gespeichert ist.

Wenn Sie in Ihrem Destruktor enden, versuchen Sie, den Speicher Ihrer ausführbaren Datei zu löschen, da Sie nicht mehr auf den zugewiesenen Speicher verweisen.

Wie Sie nicht verwenden können std::string oder strcpy, ich denke, Sie es selbst schreiben:

auto fixedUnknownString = "UNKNOWN"; 
assert(fixedUnknownString[length] == '\0'); // Lucky coinsidence, extra code required if we wouldn't have an exact match 
for (std::size_t i = 0; i < length; ++i) { 
    data[i] = fixedUnknownString[i]; 
} 
+0

Also gibt es keine Notwendigkeit, den zugewiesenen Speicher freizugeben? oder ist es ein logischer Fehler? Dies ist eine College-Aufgabe, und ich kann Daten nur auf diese Weise entsprechend der Aufgabe initialisieren. – Akra

+0

Ja, Sie müssen den zugewiesenen Speicher freigeben, obwohl Sie den Zeiger darauf verloren haben, so dass Sie ihn nicht mehr freigeben können. – JVApen

+0

@Akra: Es ist ein logischer Fehler. Wenn Sie 'strcpy()' nicht verwenden können, müssen Sie es simulieren, um die Bytes von "UNKNOWN" (einschließlich des Nullbytes) in das zugewiesene "data" -Array zu übertragen. Dann wird das 'delete [] data;' funktionieren. Im Moment haben Sie keine Aufzeichnungen darüber, was zugewiesen wurde (wegen des Speicherlecks), so dass Sie es nicht löschen können. –

Verwandte Themen