Gültigkeitsbereiche - globale Zeigervariable

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Gültigkeitsbereiche - globale Zeigervariable

Beitrag von hackmack » Di Nov 03, 2009 7:19 pm

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
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

AnGaiNoR
Beiträge: 212
Registriert: Sa Jul 19, 2008 7:07 pm
Wohnort: Dresden

Re: Gültigkeitsbereiche - globale Zeigervariable

Beitrag von AnGaiNoR » Di Nov 03, 2009 7:27 pm

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.
Physics is like sex: sure, it may give some practical result, but that's not why we do it.
(Richard P. Feynman)

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: Gültigkeitsbereiche - globale Zeigervariable

Beitrag von hackmack » Di Nov 03, 2009 7:45 pm

Wie ist das dann genau mit dem freigeben? Ist das immer so, egal ob ich es selbst mit delete oder der Compiler automatisch macht?
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Gültigkeitsbereiche - globale Zeigervariable

Beitrag von Xin » Di Nov 03, 2009 8:49 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
hackmack
Beiträge: 85
Registriert: Do Mär 26, 2009 10:16 pm

Re: Gültigkeitsbereiche - globale Zeigervariable

Beitrag von hackmack » Di Nov 03, 2009 9:13 pm

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.
They say, if you play a Microsoft CD backwards, you hear satanic messages. Thats nothing, cause if you play it forwards, it installs Windows.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Gültigkeitsbereiche - globale Zeigervariable

Beitrag von Xin » Di Nov 03, 2009 9:24 pm

@hackmack: Deine Antwort war übrigens das 10000 Posting im Forum. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten