2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Wir wissen, dass delete zum Freigeben eines dynamischen Raums und delete [] zum Freigeben mehrerer dynamischer Räume verwendet wird. Welche Probleme treten jedoch auf, wenn wir sie mischen? Ich habe viele Artikel auf dem Blog gelesen, aber sie sind nicht zufriedenstellend, deshalb habe ich diesen Artikel geschrieben, um Ihnen mitzuteilen, was es ist und warum (Eine oberflächliche Erklärung, bitte korrigieren Sie mich)。
---------------------------------------------------------------------------------------------------------------------------------
Wir können uns zunächst ein Beispiel ansehen:
Das laufende Ergebnis ist:
Aber wenn wir den Destruktor nicht explizit schreiben:
Das Ergebnis ist ein normaler Betrieb:
---------------------------------------------------------------------------------------------------------------------------------
Warum?
Wenn ich Sie frage, wie viel Speicherplatz das System diesen 10 Objekten der Klasse A zuweist, werden Sie höchstwahrscheinlich mit 40 Bytes antworten.Es ist leicht zu verstehen. Ein A ist 4 Bytes und 10 sind 40 Bytes. .Wenn Sie den Destruktor jedoch selbst schreiben, werden insgesamt 44 Bytes zugewiesen. Wenn Sie keinen Destruktor schreiben, werden insgesamt 40 Bytes zugewiesen.。
Warum gibt es nach dem Schreiben des Destruktors 4 weitere Bytes? Wir wissen, dass nach der Verwendung von delete zum Freigeben dieses Speicherplatzes der Destruktor automatisch aufgerufen wird (http://t.csdnimg.cn/f2FOj), (1) Wenn wir den Destruktor selbst schreiben, muss delete ihn aufrufen (Tatsächlich ist delete auch eine Funktion, was einem verschachtelten Aufruf der Funktion entspricht.), dann ist es eine Frage, wie oft es aufgerufen wird. Diese vier Bytes haben genau die Größe einer Ganzzahl. Diese Ganzzahl wird verwendet, um die Anzahl der Objekte in diesem Raum aufzuzeichnen und so zu bestimmen, wie oft der Konstruktor und der Destruktor sein müssen angerufen.Sie müssen jedoch wissen, dass der p-Zeiger weiterhin auf das erste Objekt zeigt, aber während des Aufbaus und der Zerstörung vorwärts geht, um die Anzahl der Objekte zu ermitteln.Die spezifische Beziehung ist wie folgt:
(2) Wenn wir zu diesem Zeitpunkt keinen Destruktor schreiben, ruft er den vom Compiler generierten Destruktor auf, ohne die Häufigkeit aufzuzeichnen (es kann sich um eine niedrigere Ebene handeln, ich bin mir nicht sicher, bitte korrigieren Sie mich) und Es ist nicht erforderlich, eine zusätzliche plastische Chirurgie zu eröffnen.
Okay, jetzt können wir das obige Beispiel erklären
„Delete“ gibt standardmäßig Platz von der Position frei, auf die der Zeiger zeigt. „delete[]“ prüft zunächst, ob standardmäßig mehr Platz geöffnet ist, und bewegt den Zeiger in diesem Fall um eine Position nach vorne, bevor er ihn freigibt. Wenn Sie mehr Speicherplatz öffnen oder Löschen verwenden, um den Speicherplatz freizugeben, kann der geöffnete Speicherplatz nicht freigegeben werden, was zu einem Speicherverlust führt und daher einen Fehler meldet.
Bekomme ich eine Fehlermeldung, wenn ich das übe? :
Es ist nicht erforderlich, den Destruktor aufzurufen, die Anzahl der Objekte zu zählen und keinen weiteren Speicherplatz zu öffnen. Daher kann der Speicherplatz von der Position, auf die der Zeiger zeigt, freigegeben werden, sodass kein Fehler auftritt gemeldet.
Es gibt viele Situationen, Sie können hingehen und es selbst ausprobieren.