Speicher freigabe



  • Hallo,
    zuerst einmal der code auf den sich die Frage bezieht:

    int *iPt;
    CObject *objPt;
    objPt = new CObject;
    iPt = (int*)objPt;
    delete iPt;
    

    und nun die Frage: Wird mit delete jetzt der gesamte Speicher von dem Objekt freigegeben, oder nur soviel Byte wie ein Integer gehabt hätte?



  • So viel, wie das int hat. Pointercasts sind natürlich evil und absolut tödlich sind Pointer-C-Casts. Und noch tödlicher sind Raw-Pointer-C-Casts. 🤡 👍



  • ok, thx...



  • Wird mit delete jetzt der gesamte Speicher von dem Objekt freigegeben, oder nur soviel Byte wie ein Integer gehabt hätte?

    Weder noch. Der Code hat undefiniertes Verhalten (5.3.5/3). Könnte theoretisch auch den dritten Weltkrieg auslösen (ist aber unwahrscheinlich, da C++ Compiler in der Regel nicht über nukleare Waffen o.Ä. verfügen).



  • Kannst du das mal erläutern wieso das undefiniert ist?



  • dEUs schrieb:

    Kannst du das mal erläutern wieso das undefiniert ist?

    C++ Standard schrieb:

    [...]if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand's dynamic type and the static type shall have a virtual destructor or the behavior is undefined

    In diesem Fall ist der static type int und der dynamic type CObject. Da int weder Basisklasse von CObject ist noch einen virtuellen Dtor hat, ist das Verhalten undefiniert.



  • Wie wärs, wenn du dir die betreffende Stelle einach mal anguckst

    In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined.

    Optimizer schrieb:

    So viel, wie das int hat.

    IdR nicht. Operator delete ist per default wie folgt definiert

    void operator delete(void*) throw();
    

    Dh, der darunterliegende Memory Handler für Deallokierung bekommt lediglich einen Zeiger. Nach diesem sucht er in seiner internen Verwaltung, und gibt dann den Speicher frei, der diesbezüglich irgendwann mal reserviert wurde.


Anmelden zum Antworten