Seite 1 von 1
Gültigkeitsbereiche - globale Zeigervariable
Verfasst: Di Nov 03, 2009 7:19 pm
von hackmack
Hallo,
ich habe grade mal zur Übung ein Programm verfasst, um genauer bei Gültigkeitsbereichen und Zeiger und so durchzublicken. Dabei bin ich auf etwas gestoßen, was ich nicht so ganz kapiere:
Code: Alles auswählen
#include <iostream>
using namespace std;
void ersteFunc();
void zweiteFunc(int &test);
int *iptr;
int main()
{
ersteFunc();
cout << *iptr;
}
void ersteFunc()
{
int izahl = 1254;
zweiteFunc(izahl);
}
void zweiteFunc(int &test)
{
iptr = &test;
}
Wenn ich das Programm jetzt ausführe, kommt beim compilieren (eigentlich erwartungsgemäß) kein Fehler, aber auch beim Ausführen nicht, sondern er zeigt mir die Zahl 1254 an, so wie ich sie in izahl gespeichert habe. Ist es nicht eigentlich nicht so, dass nachdem eine Funktion fertig ist, alle ihre lokalen Variablen vernichtet werden? Oder ist es nur so, dass die Werte der Variablen trotzdem noch im Speicher bleiben, sie nur nicht mehr über ihren Namen erreichbar sind?
Folgender Code funktioniert aber wieder wie ich es mir vorgestellt habe (sprich: es wird nur 0 angezeigt, und nicht 125)
Code: Alles auswählen
#include <iostream>
using namespace std;
void ersteFunc();
void zweiteFunc(int &test);
int *iptr;
int main()
{
ersteFunc();
cout << *iptr;
}
void ersteFunc()
{
int *izahl = new int(125);
zweiteFunc(*izahl);
delete izahl;
}
void zweiteFunc(int &test)
{
iptr = &test;
}
Liegt das daran, dass ich hier izahl selbst auf dem Heap angelegt habe und auch wieder selbst gelöscht?
Mfg.
hackmack
Re: Gültigkeitsbereiche - globale Zeigervariable
Verfasst: Di Nov 03, 2009 7:27 pm
von AnGaiNoR
Die Variable izahl wird nicht direkt gelöscht, nur ihr Speicher wird freigegeben. Beim Freigeben des Speichers wird dieser nicht zwingend auf 0 gesetzt, sondern bleibt in der Regel so wie er ist.
Re: Gültigkeitsbereiche - globale Zeigervariable
Verfasst: Di Nov 03, 2009 7:45 pm
von hackmack
Wie ist das dann genau mit dem freigeben? Ist das immer so, egal ob ich es selbst mit delete oder der Compiler automatisch macht?
Re: Gültigkeitsbereiche - globale Zeigervariable
Verfasst: Di Nov 03, 2009 8:49 pm
von Xin
hackmack hat geschrieben:Wenn ich das Programm jetzt ausführe, kommt beim compilieren (eigentlich erwartungsgemäß) kein Fehler, aber auch beim Ausführen nicht, sondern er zeigt mir die Zahl 1254 an, so wie ich sie in izahl gespeichert habe. Ist es nicht eigentlich nicht so, dass nachdem eine Funktion fertig ist, alle ihre lokalen Variablen vernichtet werden? Oder ist es nur so, dass die Werte der Variablen trotzdem noch im Speicher bleiben, sie nur nicht mehr über ihren Namen erreichbar sind?
Das "Vernichten" der Variablen würde ja Arbeit bedeuten, also das Programm verlangsamen. Verstehe Vernichten hier nicht als aktiven Prozess der bewußten Zerstörung. Schreib Dir eine dritte Funktion mit 10 Integer-Argumenten, ruf die nach cout << *iptr nochmal auf, in dem Du die Argumente durchnummerierst und guck, was dann rauskommt.
hackmack hat geschrieben:Folgender Code funktioniert aber wieder wie ich es mir vorgestellt habe (sprich: es wird nur 0 angezeigt, und nicht 125)
Code: Alles auswählen
int *izahl = new int(125);
zweiteFunc(*izahl);
delete izahl;
Liegt das daran, dass ich hier izahl selbst auf dem Heap angelegt habe und auch wieder selbst gelöscht?
Auch hier gibt es kein gesichertes Verhalten. Die Variable liegt auf dem Heap, was in der Zwischenzeit damit passiert, weiß kein Mensch. Du kannst den Heap allerdings nicht so kontrolliert überschreiben, wie den Stack. Wenn Du nochmal Speicher anforderst, kann die Variable wieder da sein, oder was ganz anderes - je nachdem, wo Du im physikalischen Speicher Deinen Speicher vom OS zugewiesen bekommst.
Beide Codes sind semantisch falsch, was ein C-Compiler aber nicht so tiefgehend prüft oder prüfen kann. Beide Codes erzeugen nicht definierte Ergebnisse.
hackmack hat geschrieben:Wie ist das dann genau mit dem freigeben? Ist das immer so, egal ob ich es selbst mit delete oder der Compiler automatisch macht?
Speicher auf dem Stack gibst Du nicht das OS zurück. Du verwendest ihn wieder.
delete gibt Speicher an das OS zurück, damit andere Programme ihn verwenden können.
Re: Gültigkeitsbereiche - globale Zeigervariable
Verfasst: Di Nov 03, 2009 9:13 pm
von hackmack
Xin hat geschrieben:
Auch hier gibt es kein gesichertes Verhalten. Die Variable liegt auf dem Heap, was in der Zwischenzeit damit passiert, weiß kein Mensch. Du kannst den Heap allerdings nicht so kontrolliert überschreiben, wie den Stack. Wenn Du nochmal Speicher anforderst, kann die Variable wieder da sein, oder was ganz anderes - je nachdem, wo Du im physikalischen Speicher Deinen Speicher vom OS zugewiesen bekommst.
Beide Codes sind semantisch falsch, was ein C-Compiler aber nicht so tiefgehend prüft oder prüfen kann. Beide Codes erzeugen nicht definierte Ergebnisse.
Dass beide Codes nicht so wirklich sauber und gut sind, ist mir klar. Danke für die Antworten.
Re: Gültigkeitsbereiche - globale Zeigervariable
Verfasst: Di Nov 03, 2009 9:24 pm
von Xin
@hackmack: Deine Antwort war übrigens das 10000 Posting im Forum. ^^