Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Was passiert hier?

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456

    Was passiert hier?

    Mal rein theoretisch:

    ich lege eine Objektinstanz dynamisch mit "new" an, erhalte einen Zeiger. Nun erstelle ich eine Referenz auf diese Instanz mit
    Code:
    CBlubbObject &cReferenz = *pInstanz;
    Was passiert nun, wenn ich die Instanz mit delete pInstanz; lösche? Kann ich danach noch über die Referenz auf das Objekt zugreifen? Oder führt das unweigerlich zum Absturz?

    Danke

    Grüße,
    Hendrik
    Anwendungsentwickler; ehem. Siemens, jetzt Nokia Siemens Networks GmbH. & CO KG
    C/C++;C#;VB;ASP.NET;Ajax;MSSQL
    Webentwicklung/Design; privat
    PHP;MySQL;HTML;XML;Typo3;Photoshop;ASP.NET;Ajax;MS SQL

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Der Mensch, der seine Fragen selbst beantwortet... hey, es ist Mo... Mittwoch Morgen *gäääähn*

    Nach einem kleinen Test in der Form:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    class CTest
    {
    public:
    	CTest() {}
    	~CTest() {}
    	
    public:
    	void Msg()
    	{
    		printf("Hallo Welt\n");
    	}
    	
    };
    
    int main(void)
    {
    
    	CTest* pTest = new CTest;
    	CTest& cReferenz = *pTest;
    	
    	printf("Zeiger...\n");
    	pTest->Msg();
    
    	printf("Referenz...\n");
    	cReferenz.Msg();
    	
    	delete pTest;
    	
    	printf("Gelöscht...\n");
    	cReferenz.Msg();	
    }
    stellte sich heraus, daß ich tatsächlich noch auf das Objekt zugreifen kann. Aber... wie lange geht das gut? Ist der Speicher noch vom Programm reserviert, solange die Referenz existiert? Oder ist der Speicher freigegeben und nur noch verwendbar, weil noch niemand drüber gekliert hat?

    Danke.

    Grüße,
    Hendrik
    Anwendungsentwickler; ehem. Siemens, jetzt Nokia Siemens Networks GmbH. & CO KG
    C/C++;C#;VB;ASP.NET;Ajax;MSSQL
    Webentwicklung/Design; privat
    PHP;MySQL;HTML;XML;Typo3;Photoshop;ASP.NET;Ajax;MS SQL

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    ich lege eine Objektinstanz dynamisch mit "new" an, erhalte einen Zeiger. Nun erstelle ich eine Referenz auf diese Instanz mit

    Code:
    CBlubbObject &cReferenz = *pInstanz;

    Was passiert nun, wenn ich die Instanz mit delete pInstanz; lösche? Kann ich danach noch über die Referenz auf das Objekt zugreifen? Oder führt das unweigerlich zum Absturz?
    Die Antwort auf die die letzten beiden Fragen lautetet "weder noch". Wenn das geschieht ist das Verhalten deines Programms von C++ nicht mehr definiert. Der C++-Implementierung wäre es erlaubt den Speicher solange Vorrätig zu halten bis er nicht mehr gebraucht wird, dann würde dein Programm möglicherweise nicht abstürzen. Die Implementierung könnte auch das Objekt als Zombie markieren und beim Zugriff das Programm unweigerlich terminieren. Aber du kannst dich halt nicht darauf verlassen wenn du portable Programme schreiben willst.

    [...]stellte sich heraus, daß ich tatsächlich noch auf das Objekt zugreifen kann. Aber... wie lange geht das gut? Ist der Speicher noch vom Programm reserviert, solange die Referenz existiert? Oder ist der Speicher freigegeben und nur noch verwendbar, weil noch niemand drüber gekliert hat?
    Siehe oben: Auf diese Fragen gibt es keine eindeutigen Antworten. Aber ich möchte mal anmerken das du einmal von "Objekt" sprichst und dann von "Speicher", so als ob das dasgleiche wäre. Das ist es aber nicht. In C++ kann ein Objekt aufhören zu existieren obwohl von ihm verwendeter Speicher noch brauchbar ist.

  4. #4
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    der Speichermanager der c++ runtime kann dein speicher auch "freigeben", nur das BS ist zu faul da irgendwas scho drueberzubuegeln .... und wartet auf bisserl mehr, oder das es swappen muss ....

    wenn du es packst, das andere programme ihre wichtigen "Daten" in genau dem grade freigeworden speicherbereich deponieren ... kann dein zeiger ploetzlich gold wert sein ^^
    Aber daran woll wir lieber nicht weiter denken ...

    Ciao ...

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Hmm... Zwei Dinge noch dazu:

    1. Das Programm soll nicht zwingend plattformübergreifend lauffähig sein, da es sich um eines der Art handelt, die per Definition nur auf einem bestimmten Systemtyp laufen. Pseudo-Embedded, nicht für den Massenmarkt brauchbar.

    2. Ich verwende den GNU GCC zum Übersetzen.

    Ändert das irgendwas an euren Ausführungen?
    Anwendungsentwickler; ehem. Siemens, jetzt Nokia Siemens Networks GmbH. & CO KG
    C/C++;C#;VB;ASP.NET;Ajax;MSSQL
    Webentwicklung/Design; privat
    PHP;MySQL;HTML;XML;Typo3;Photoshop;ASP.NET;Ajax;MS SQL

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von 7.e.Q Beitrag anzeigen
    Ändert das irgendwas an euren Ausführungen?
    Nein.
    Du kannst immer nur unter der Annahme arbeiten, daß ein gelöschtes Objekt nicht mehr da ist.
    Alles andere ist russisches Roulette

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    zu deutsch:

    Du kannst nie checken, ob dein objekt geloescht wurde oder nicht (anhand der ueberpruefung des inhalts) ... sondern die logic deines programmes muss das sicherstellen.
    Es ist nicht definiert, was mit freigegebenen speicher passiert .... das haengt von 25000 und mehr bedingungen ab ^^

    Ciao ...

  8. #8
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Für solche Sachen bieten sich Tools wie valgrind oder electric fence an. Die brechen das Programm ab, sobald du auf freigegebenen Speicher zugreifst.

  9. #9
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Electric Fence, das sehe ich gerade, wurde durch DUMA abgelöst. Sofern ich das richtig verstanden habe... ich schau's mir gerade an.


    Edit: Entweder ich bin zu doof, oder DUMA ist kaputt. Naja... Mal sehen, was Valgrind sagt...
    Geändert von 7.e.Q (12-10-2006 um 13:17 Uhr)
    Anwendungsentwickler; ehem. Siemens, jetzt Nokia Siemens Networks GmbH. & CO KG
    C/C++;C#;VB;ASP.NET;Ajax;MSSQL
    Webentwicklung/Design; privat
    PHP;MySQL;HTML;XML;Typo3;Photoshop;ASP.NET;Ajax;MS SQL

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •