2010-12-09 8 views
1

Die Ausgabe von diesem ist 1 2 3. aber ich lösche den Speicher (free (tmp)) und kehrte dann tmp zurück. Warum druckt tmp immer noch in der Hauptfunktion? mit GCC-Compilerkann einen Speicherort nicht löschen

+3

Warum greift Ihr Code auf Speicher zu, der bereits 'free()' 'ed ist? Warum gibt die Funktion 'delete()' an erster Stelle einen Zeiger auf 'free()' ed zurück? –

+0

Als Randnotiz, nicht sicher, ob ich besonders die Node typedef gefällt. Wenn jemand nur Ihre Funktionsdefinition betrachtet, sieht es auf den ersten Blick so aus, als würden Sie eher nach Wert als nach Referenz vorgehen. Die Verwendung von typedef verringert die Lesbarkeit. Aber nur meine Meinung :) –

+0

@Demian: Ich stimme zu, aber mein Prof in der Schule verwendet, um das Gleiche zu tun. Ich hasste es, aber einige Leute scheinen gerne Zeiger in typedefs zu verstecken. – Lucas

Antwort

7

delete/free nicht notwendigerweise Speicher aus. Sie können sie als freigegeben für den Speicherzuordner markieren. Der Speicherzuordner ist dann frei, ihn erneut in einem anderen new/malloc Anruf zuzuweisen. Der Punkt ist, sobald Sie den Speicherblock freigegeben haben, sollten Sie nicht darauf zugreifen. Es ist undefined Verhalten. Undefiniertes Verhalten bedeutet, dass es abstürzen, Müll zurückgeben, alten Wert zurückgeben, Ihren Computer sprengen kann, become a skynet, oder irgendetwas anderes, abhängig von der Implementierung/Situation.

Wenn Sie vertrauliche Informationen wie kryptografische Schlüssel/Passwörter im Speicher so kurz wie möglich speichern möchten, sollten Sie den Speicher selbst mit etwas anderem füllen, bevor Sie ihn freigeben (z. B. durch Aufruf von SecureZeroMemory in Windows).

Verwandte Themen