Nullpointer?



  • Du solltest sie (i.d.R.) sogar mit new Anlegen, da die Lebensdauer sonst auf den Scope {} beschränkt ist.

    Löschen (delete) aber nicht vergessen!!!
    (Oder gleich boost::ptr_vector verwenden)



  • Das einzige problem was ich sehe ist, wenn list::push_back eine Exception wirft, was nur sein kann, wenn der Speicher ausgeht. Dann wäre der Pointer auf das grade neu angelegte Objekt flöten und du hättest ein Speicherleck.



  • O.o schrieb:

    Schlechter Stil oder vollkommen in Ordnung?
    Im Prinzip fühle ich mich wohl damit, aber vielleicht zu Unrecht, vielleicht sehe ich etwas nicht?

    3 Dinge:
    - Ausnahmesicherheit (siehe pumuckls Beitrag)
    - Hast Du auch die Dreierregel beachtet?
    - Warum heist das Ding "pmap" wenn es "pvec" hätte heißen können?



  • Erstmal danke für die Antworten. 🙂

    Also wenn ich folgendes mache:

    // wie oben.
    int main
    {
      // eigene scope ..
      {
      obj* p = new obj;
      pmap.add(p);
      } // obj tot?
    }
    

    Und anders, was passiert, wenn ich das Objekt von außen lösche; könnte es sein, dass dann mein Zeiger irgendwann auf was ganz anderes zeigt?

    int main
    {
      obj* p = new obj;
      pmap.add(p);
      delete p;
      /*
        ... nun erstelle ich andere Objekte vom Typ obj2, welcher nichts mit obj zu tun hat. Zeigt dann der gerade hinzugefügte Pointer irgendwann in so ein obj2 hinein?
     */
    }
    


  • Nachtrag als Antwort auf krümelkacker:

    - Exceptions, wird implementiert.
    - Dreierregel kannte ich bisher nicht. Notiert. Danke dafür. 🙂
    - Die Grundidee war auf einer map basiert. 😉



  • Und anders, was passiert, wenn ich das Objekt von außen lösche; könnte es sein, dass dann mein Zeiger irgendwann auf was ganz anderes zeigt?

    Ja. Du darfst den Zeiger nicht mehr dereferenzieren!

    nun erstelle ich andere Objekte vom Typ obj2, welcher nichts mit obj zu tun hat. Zeigt dann der gerade hinzugefügte Pointer irgendwann in so ein obj2 hinein?

    Nein.


  • Mod

    o.O schrieb:

    - Exceptions, wird implementiert.

    Exceptionsicherheit ist was anderes, als selber Exceptions zu schmeißen. Es geht da drum, wie gutartig sich dein Programmm im Ausnahmefall verhält. Siehe zum Beispiel erste Antwort hier:

    http://stackoverflow.com/questions/1853243/c-do-you-really-write-exception-safe-code



  • Ihr scheint zu vergessen, dass sein Objekt 0 Bytes groß ist. Was würde denn new in diesem Fall zurückgeben? Wohl auch nen Dummywert, den man eigentlich nicht dereferenzieren dürfte, also wirds wohl kein undefiniertes Verhalten sein ...


  • Mod

    Ethon schrieb:

    Ihr scheint zu vergessen, dass sein Objekt 0 Bytes groß ist. Was würde denn new in diesem Fall zurückgeben? Wohl auch nen Dummywert, den man eigentlich nicht dereferenzieren dürfte, also wirds wohl kein undefiniertes Verhalten sein ...

    Objekte sind nie 0 Byte groß. Zur Not haben sie eine Dummygröße.

    edit: Und man sollte vielleicht noch erwähnen, dass eine leere Klasse als Basisklasse wiederum eine Größe von 0 haben darf.



  • Vieleicht gehört hier noch erwähnt, dass das die EBO (Empty Base Optimization) ist, die bei manchen Compilern bei Mehrfachvererbung und komplizierteren Hierarchien leider nicht mehr greift.



  • Das Zeug von O.o ist nicht mal compilationsfähig, wenn der Destruktor

    ~pamp() { // ... delete auf alle Elemente aus _list }
    

    heißt, vermute ich...


Anmelden zum Antworten