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.
-
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 mitdelete[]wieder freizugeben.verticeswird automatisch zerstört, wenn ein Objekt vontrianglezerstö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
-
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.