Array in Initialisierungsliste befüllen



  • Hallo alle miteinander.

    Kann mir vielleicht jemand erklären warum das hier nicht klappt?

    struct triangle
    {
      triangle(int a, int b, int c) : vertices({a, b, c}) {}
      ~triangle() {
        delete[] vertices;
      }
      int vertices[3];
    };
    

    Der stürzt beim Delete mit irgendeiner Assertion ab.
    Hab aber nicht genau rausgefunden was da los ist.

    Aufgerufen wird das ganze von

    std::vector<triangle> triangles;
    triangles.push_back(triangle(a, b, c));
    

    Konstruktor und Destruktor werden beide bei push_back aufgerufen.

    Ach ja, das Array in der Initialisierungsliste befüllen geht nur mit std=c++0x.
    Wenn ich das ohne den neuen Standard mache, muss ich im Konstruktorrumpf das Array befüllen. Der fehler ist dann aber der gleiche.

    Vielen Dank schonmal.



  • Das delete ist da ja auch falsch!
    Delete rufst du nur auf, wenn du irgendwo Speicher mit new angefordert hast!
    Hier ist der Speicher automatisch.


  • Mod

    delete nur für Sachen die du mit new angefordert hast.

    edit: Zu langsam...



  • Du hast den Speicher nicht mit dem Operator new[] angefordert. Deshalb musst du dich nicht selbst darum kümmern, ihn mit delete[] wieder freizugeben. vertices wird automatisch zerstört, wenn ein Objekt von triangle zerstört wird.

    Auch Edit: Auch zu langsam...



  • Wie dumm von mir ^^. Vielen Dank.

    Aber stimmt das, dass man mit dem neuen Standard nur Arrays in der Elementliste initialisieren kann wie oben beschrieben?

    Der Compiler meinte da nämlich:

    warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x


  • Mod

    Wenn man den Satz etwas umstellt, hast du Recht (und dein Compiler sowieso):

    Nur mit dem neuen Standard kann man Arrays in der Elementliste so wie beschrieben initialisieren.



  • übrigens dann ohne die runden klammern.
    ohne den neuen standard musst du das aber auf *jeden* fall in einer schleife machen.


Anmelden zum Antworten