ptr mit vc++



  • Hi,

    hab mal ne frage zu pointern:

    wieso kann ich die addressen funktionslokaler Basistypen zurückgeben und dann normal mit weiterarbeiten? Wiederspricht das nicht der Konvention, dass lokale Objekte nach verlassen des Gültigkeitsbereiches gelöscht werden, und somit ein pointer auf diese objekte auf nichts zeigt?

    Wenn ich das ganze mit einem selbsdefiniertem Klassenobjekt mache, verhält sich das Programm, wie erwartet... es stürzt ab.

    int *test2()
    {
    	int i=28;
    
    	return &i;
    }
    
    int main()
    {
    cout<<*test2() // bekomme zwar ne warnung, aber funktioniert
    return 0;
    }
    
    class Ulk
    {
    public:
    
    	string name;
    
    	Ulk(string s):name(s){}
    };
    
    Ulk *test2()
    {
    	Ulk u("James");
    
    	return &u;
    }
    
    int main()
    {
    cout<<test2()->name;  // und tschüs...
    
    return 0;
    }
    

    Nutze Vc++ 6.0.
    wieso verhält sich das so? MFG, '][' !



  • das mit dem int funktioniert "zufällig" mal. der int wird auf dem stack angelegt und der speicher da ist ja nicht weg oder zerstört.
    der speicher ist zwar noch zufällig da, aber gehört dir nicht mehr.
    er kann leicht überschrieben werden, wie mit

    int* pi=test2();
    {
       char x[100]="jdifosdfisdnäsdnsdjänsdoä";
    }
    cout<<*pi;
    

    beim string ist es schlimmer. der destruktor hat den string bereits gelöscht! da wirste auf NULL zugegriffen haben oder auf mit delete gelöschten speicher und die kiste ist abgeschmiert.



  • Weil du auf ein Objekt zugreifst welches nicht mehr existiert, du provozierst
    somit undefiniertes Verhalten, was bei dir der Abbruch des Programmes ist.
    Dass das obere funktioniert ist reiner Zufall, denn auch diese Variable existiert
    nicht mehr.

    Edit:

    Da war jemand schneller 🤡



  • lokale Stack- Objekte werden doch freigegeben, wenn die funktion endet, oder wenn das Programm endet?

    Wenn die Funktion endet, ist es dann richtig, dass der speicher zwar freigegeben( sprich man kann ihn überschreiben), aber nicht gelöscht wird?
    Das würde erklären, dass ich noch drauf zugreifen kann.



  • Nein, er ist bereits wieder freigegeben, du hast nur noch einen Zeiger darauf und
    kannst daher den Inhalt lesen, beim schreibzugriff wird unt Linux/Windows das
    Programm beendet, da du in fremden Speicher schreiben möchtest.



  • SirLant schrieb:

    beim schreibzugriff wird unt Linux/Windows das
    Programm beendet, da du in fremden Speicher schreiben möchtest.

    unwarscheinlich. der stack bleibt am leben. ist schneller so. und der freispeicher oft auch.


Anmelden zum Antworten