int *a, *b;
a = new int[10];
b = new int(12);
b = a; // I know there's memory leak, but let's ignore it first
delete [] b; // line L
Wird das gesamte Array erfolgreich gelöscht werden?
Ja, wird Speicher erfolgreich freigegeben werden, da der Zeiger a
eingestellt wurde auf ein Array von 10 ganzen Zahlen Adresse in b
gespeichert
a = new int[10];
dann die gleiche Speicherstelle hinzuweisen
b = a;
daher die delete[]
Zeile korrekt deallocates das Array Chunk
delete [] b;
Wie Sie festgestellt haben, leckt der Code auch die Ganzzahlvariable 12, die ursprünglich zugewiesen wurde und auf die b
zeigt.
Als Nebenbemerkung delete[]
Aufruf Speicher frei nicht mit einem Array zugeordnet (genauer gesagt mit einem statischen Typenkonflikt - siehe [expr.delete]/p3) undefiniertes Verhalten ausgelöst hätte.
Jetzt für einige Interna auf, wo ist die Größe Informationen bei der Zuweisung von Speicher gespeichert.
Compiler haben einen gewissen Freiheitsgrad (vgl. §5.3.4/10), wenn es um Speicherzuweisungsanforderungen geht (z. B. können sie Speicherzuordnungsanforderungen "gruppieren").
Wenn Sie new
ohne mitgelieferten allocator nennen, sei es malloc
nennen oder nicht, ist es Implementierung
definiert
[new.delete.single]
eine Schleife Führt: Innerhalb von Schleife versucht die Funktion zuerst, den angeforderten Speicher zuzuordnen. Ob der Versuch einen Aufruf der Standard-C-Bibliotheksfunktion malloc beinhaltet, ist nicht angegeben.
Unter der Annahme, es ruft malloc()
(auf den letzten Windows-Systemen den UCRT nennt), versucht, Speicherplatz zuweisen bedeutet mit paged virtual memory Buchführung zu tun, und das ist, was malloc in der Regel der Fall ist.
Ihre Größeninformationen werden zusammen mit anderen Daten zur Zuweisung des von Ihnen angeforderten Speichers weitergegeben.
C-Bibliotheken wie glibc kümmern sich um Ausrichtung, Speicherüberwachung und Zuweisung einer neuen Seite (falls erforderlich), damit diese über einen Systemaufruf in den Kernel gelangen kann.
Es gibt keinen "Standard" Weg, diese Informationen nur von der Adresse zurück zu bekommen, da es ein Implementierungsdetail ist. Wie viele haben vorgeschlagen, wenn Sie eine solche Informationen benötigen, so könnte man
- speichern die Größe irgendwo
- Verwendung
sizeof()
mit einem Array-Typ
- noch besser für C++: Verwenden Sie eine
std::vector<>
Diese Information ist außerdem mit einer Speicherzuweisung verbunden, in beiden Ihren sekundären Fällen (dh die L
Zeile wird durch
ersetzt 0
oder
a++; delete [] a;
wird in Tränen enden, da diese Adressen nicht mit einer gültigen Zuordnung zugeordnet ist.
Die Längeninformationen sind verloren, so einfach. Wenn Sie den Überblick behalten möchten, verwenden Sie stattdessen 'std :: vector'. Intern 'new'' delete' wird die Buchhaltung der Adresse des ersten Elements durchgeführt. –
Mein g ++ signalisiert "free(): invalid pointer" wenn (b = a + 1; delete [] b;) und delete [] nachdem a ++ wie undefiniertes Verhalten aussieht, da Sie versuchen werden, auf freien Speicher zuzugreifen. – user3655463