Wenn ein pointer erstellt wird, in der Umfang, was passiert, um die Spitzen zu variabel, wenn der Mauszeiger den Bereich verlässt?
Der Titel sagt alles.
Ich fand eine alte Frage, die im wesentlichen die gleichen, aber ich brauchte ein kleines bisschen weiteren Abklärung.
In dieser Frage die akzeptierte Antwort sagt:
char* text = "Hello, world";
Hier eine automatische variable (pointer) ist
auf dem Stapel erzeugt und eingestellt auf einen Wert, der in steter Erinnerung,
das bedeutet:
- der string in "" existiert durch das ganze Programm-Ausführung.
- Sie sind nicht verantwortlich für "Zuweisung" oder "freigeben" es
- können Sie nicht
ändern Sie es. Wenn Sie es ändern wollen, dann müssen Sie reservieren einige
"non-constant memory", und kopieren Sie es.
Ist dieser Spruch, dass der Zeiger gelöscht wird, nicht aber die Daten, die der Zeiger verweist?
Wenn ich zum erstellen von 1.000.000 Zeiger auf Zeichen in einer Funktion, wenn Sie außerhalb des Bereichs würde alle meine Speicher freigegeben werden? Oder einfach nur der Speicher benötigt, um die Zeiger, so dass die tatsächlichen Zeichen, die sich hinter der hog-alle meine Speicher?
- Der Zeiger ist nicht gelöscht. Es wird zerstört, was im Falle eines Zeigers, tut nichts.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Arrays von Zeichen wird hängen, um für die gesamte Ausführung des Programms, denn Sie haben static storage duration. Dies bedeutet nicht, dass Sie brauchen, um Sie zu löschen - Sie sind soll zu bleiben, um für die gesamte Dauer des Programms. In der Tat, ruft
delete
auf, es wird Ihnen ein Undefiniertes Verhalten. Sie können nurdelete
etwas reserviert wurde mitnew
.Den Zeiger selbst haben automatische Speicherdauer und werden zerstört, wenn Sie gehen out of scope. Es ist erwähnenswert, dass der Zeiger hat eine
const char*
weil das string-literal gibt Sie ein array vonconst char
. Bedenken Sie:Array von Zeichen mit
Hello\0
besteht für die Dauer des Programms. Die Zeigerstr
existiert nur für die Dauer dieser Funktion. Nichts mussdeleted
hier.Das macht sehr viel Sinn, wenn man darüber nachdenkt. Alle diese Zeichenfolgen, die Sie schreiben in Ihrem source-code vorliegen müssen, um in der ausführbaren Datei irgendwo. Der compiler in der Regel schreibt diese strings von Zeichen in der Daten-segment in die ausführbare Datei. Wenn man mit dem Programm die ausführbare Datei wird in den Speicher geladen, zusammen mit den Daten-segment mit Saiten.
Wenn Sie zwei string-Literale in Ihrem Programm, die den gleichen oder überlappende text, es gibt keinen Grund, kann der compiler nicht optimieren, es zu speichern, nur eine von Ihnen. Bedenken Sie:
Der compiler braucht nur zu schreiben, die Charaktere
Hello\0
in die ausführbare Datei einmal hier. Die ersten zwei Zeiger wird einfach auf dieH
und der Dritte Punkt, um den zweitenl
. Dein compiler kann Optimierungen machen wie diese. Natürlich, mit diesem Beispiel kann der compiler noch weiter optimieren, indem Sie nur loszuwerden, die Saiten alle gemeinsam - Sie sind nicht in irgendeiner Weise verwendet, die dazu beiträgt, um das beobachtbare Verhalten des Programms.Also ja, wenn Sie eine million verschiedene string-Literale, die in irgendeiner Weise dazu beitragen, um das beobachtbare Verhalten des Programms, natürlich haben Sie es als Teil der ausführbaren Datei.
unsigned char* imageData;
auf, die anschließend wird geworfen in eine andere Funktion, und gibt engorged mit Daten. Nachdem ich alle nötigen Maßnahmen mit den Bilddaten, wenn ich nicht explizit löschen, wird der Mauszeiger außerhalb des Bereichs und freigegeben werden, sondern alle Daten, die er zeigte, um zu bleiben?delete
Sie. Das bedeutet nicht, dass das string-literal wird automatisch zerstört, wenn der Mauszeiger den Bereich verlässt - es kann einfach nicht vernichtet werden! Wenn jedoch weisen Sie das array, dasimageData
Punkte auf von etwas wienew unsigned char[100]
dann dieses array hat dynamic storage duration und mussdelete[]
d, ansonsten haben Sie ein Speicherleck. Die goldene Regel: immer Nurdelete
/delete[]
was Sienew
/new[]
!Ich würde sagen "nichts" (eine Antwort auf die Titel), wenn es genug wäre, SO halten es für eine Antwort.
Als für Ihren Mio Zeiger auf Zeichen, während der Zeiger bekommt knallte (obwohl Sie gotta haben ganz einen stack zu halten-Millionen-Zeiger) die Daten, auf die Sie verweisen, wird heimsuchen Ihre Erinnerungen.
Dein Beispiel ist leider nicht ausreichend, um Adresse das vollständige Bild.
Zunächst einige einfache ad-hoc-Vokabular und Erläuterungen: eine Speicherzelle ist ein (geschrieben in C++) zone der Speicher mit einer bestimmten Größe, es enthält eine Wert. Mehrere memory-Zellen identische Werte enthalten, ist es egal.
Gibt es 3 Arten von Speicherzellen, dass Sie sollten in Betracht ziehen:
"Hello, World!"
: dieser Speicher Zelle hat statische Speicher Dauer, es besteht während der gesamten Dauer des Programmsvoid foo(int a);
undvoid foo() { int a = 5; }
: der Speicher Zellea
in beiden Fällen hat automatische Speicherdauer, es wird verschwinden automatisch, sobald die Funktionfoo
gibtvoid foo() { int* a = new 5; }
: ein anonymer Speicher Zelle angelegt wird "irgendwo" um den Wert zu speichern5
, und eine Speicher Zellea
mit automatischer Speicherung Dauer angelegt ist, die zum speichern der Adresse des anonymen eineGut, nur, dass. Der Zeiger verschwindet. Die meisten speziell, nichts besonderes passiert, der Speicherzelle war es verweist.
In der Tat, in C und C++:
Nichts.
Den Zeiger selbst nimmt Platz auf der "automatische Speicherung" (das ist normalerweise der stack). Es wird entfernt, sobald die Funktion gibt [oder der Rahmen fertig ist, aber technisch, fast alle Compiler "warten", bis die Funktion zurückkehrt, bevor der Speicherplatz freigegeben wird].
Wenn Sie rufen Sie die gleiche Funktion in einer Schleife 1 Mio mal, gibt es nur EINEN Zeiger zu einem bestimmten Zeitpunkt. Wenn Sie 1 Millionen Funktionen [und eine Menge von Speicher], gibt es einen Zeiger für jede Funktion, die derzeit genannt. E. g.
Kommen wir in die main
text4
wird auf dem Stapel erzeugt - es wird initialisiert den string "Main", die in einigen anderen bit des Speichers. Wenn wir dann rufenbaz()
,text3
wird angelegt und initialisiert "Meh", fordertbar()
erstellttext2
und verweist auf den text "Welt", und fordertfoo
schaffttext1
und initalizes zuHello
. Alsfoo
gibt, wird die Adresse innerhalbtext1
wird als Rückgabewert, und die Zeiger selbst Weg geht. Wennprintf()
fertig ist,bar
zurück, und der Zeiger verschwindet.Den String "Main", "Meh", "Hallo" und "Welt" sind immer noch dort bleiben, solange das Programm ausgeführt wird.