Anzeige:
Ergebnis 1 bis 5 von 5

Thema: C++ : Frage zu "new" und "delete"

  1. #1
    Registrierter Benutzer Avatar von DanDanger
    Registriert seit
    15.12.2001
    Ort
    /home/dandanger
    Beiträge
    130

    C++ : Frage zu "new" und "delete"

    Hallo,

    ich habe eine Frage zu den "new" und "delete" - Funktionen in C++ :

    Ich habe eine Klasse "CBasePart". Diese Klasse Besitzt SET und GET-Funktionen,
    um Ihre Nutzdaten (hier : Integer-Werte) zu setzen und Auszugeben.

    ich habe nun folgende Funktion :
    Code:
    void foo()
    {
      CBasePart *aPart = new CBasePart(3) ; // Neues Objekt anlegen => "3" als Nutzdatum
    
      cout << aPart->GetValue() << endl ;
    
      delete aPart ;  // aPart Objekt loeschen
    
      aPart->SetValue(5) ; // Sollte hier SegFaulten !!
    
      cout << apart->GetValue() << endl ;
    }
    Das seltsame ist : Hier gibt es KEINEN SegFault ????
    Das Programm gibt brav :
    Code:
    3
    5
    aus, dabei sollte doch spätestens beim aPart->SetValue(5) Aufruf ein SegFault
    auftreten, da das aPart-Objekt doch per delete gelöscht wurde ???

    Meine Frage : Warum funzt das denn immer noch (ohne segFault) ??
    Werden mit delete gelöschte Objekte nicht Automatisch mit NULL Überschrieben ??

    PS : Compiliert habe ich das mit dem g++ Ver. 2.95 und g++ Ver. 3.2

    Neugierige Grüsse
    DanDanger
    ------------------------------------
    DanDanger

  2. #2
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Nein, die werden nicht überschrieben. Die werden nur als gelöscht markiert. Wenn du Speicher mit malloc bestellst, ist der auch nicht 0.

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: C++ : Frage zu "new" und "delete"

    Original geschrieben von DanDanger
    aus, dabei sollte doch spätestens beim aPart->SetValue(5) Aufruf ein SegFault
    auftreten, da das aPart-Objekt doch per delete gelöscht wurde ???

    Meine Frage : Warum funzt das denn immer noch (ohne segFault) ??
    Das Object wurde gelöscht, aber wenn der Speicher noch nicht mit anderen Sachen überschrieben wurde, geht der Zugriff natürlich noch.


    Werden mit delete gelöschte Objekte nicht Automatisch mit NULL Überschrieben ??
    Nein, das wäre nur zusätzlicher Overhead. Wenn der Speicher neu zugeteilt wird, dann überschreib die neue Nutzung den Bereich mit neuen Daten.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Hmm...

    ..................................
    Geändert von Lin728 (19-08-2017 um 21:38 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Dieser Overhead ist es, der mir von C++ vernhält. Ein unterentwickeltes Exception-Handling, und überhaupt keine Checks, weil das ja 3 Instruktionen dauert, bis man weiß ob man ungültig zugreift....
    Wenn mans wenigstens explizt einschalten könnte.
    *trollback* Wenn du nachgeschaut hättest, hättest du gesehen, dass new/delete intern auf die c-funktionen malloc/free zurückgreift. Und die lassen sich Fehler-Intoleranter machen, indem eine Preprozessor-Definition (#define MALLOC_CHECK_=2) hinzugefügt wird.

    malloc alloziert pro allozierem Speicherbereich 4Bytes mehr für Verwaltungs-Aufgaben. Wenn du diese überschreibst, und das Makro nicht gesetzt wird, ignoriert malloc alle ungewohnten Situationen. Das kann dazu führen, dass der Fehler erst viel später auftritt, mit entsprechendem "Verwirrfaktor".

    Ich verzichte wenn möglich auf Pointer. Diese bringen vielfach Probleme mit sich, die nicht sein müssten (Segfault, nicht freigegebener Speicher, doppelt freigegebener Speicher etc.). Das auto_ptr<> Template aus der STL hilft teilweise. Und für andere Fälle habe ich eine Sptr-Klasse (Smart-Pointer), welche die Referenzen zählt. Und moderne C++ Libraries bringen solche Funktionen mit.

    Gruss, Andy

Lesezeichen

Berechtigungen

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