Klasse in Vector speichern
-
Wie wär es mit
win.push_back(window::window(0,0));
?
-
Hacker schrieb:
Wie wär es mit
win.push_back(window::window(0,0));
?
Warum sollte das denn funktionieren?
-
theta schrieb:
Hacker schrieb:
Wie wär es mit
win.push_back(window::window(0,0));
?
Warum sollte das denn funktionieren?
Weil es das tut ...?
Hast du es denn etwa nicht ausprobiert ?
Manmanman...
-
Hacker schrieb:
Wie wär es mit
win.push_back(window::window(0,0));
?
Funzt nicht. http://ideone.com/psF3i
Merke: GCC hat (fast) immer Recht.
-
???
Bei mir funzts problemlos...
Selber Quellcode, selber Compiler (!) (obwohl mit der Version bin ich mir nicht Sicher) ...Crazy...
-
Hacker schrieb:
Crazy...
Der Code ist falsch. Der Konstruktoraufruf ist window(0,0) nicht window::window(0,0); Und auch der GCC akzeptiert sowas nicht.
-
otze schrieb:
Der Code ist falsch. Der Konstruktoraufruf ist window(0,0) nicht window::window(0,0); Und auch der GCC akzeptiert sowas nicht.
Einige Versionen schon, z.B. schluckt es der 4.4.3.. Dadurch wird es natürlich trotzdem nicht richtig oder gar standardkonform. Es ist bloß ein "Feature" eines bestimmten Compilers in einer bestimmten Version, dies ausnahmsweise zu schlucken.
Und @Hacker: Warum schlägst du denn andauernd solche falschen oder halbfalschen Sachen vor, wenn du dir selber nicht sicher bist? So etwas kann man doch ganz leicht testen. Und wenn du dir bei einer Antwort selber nicht sicher bist, dann antworte doch lieber gar nicht (oder frag selber nach) anstatt den Fragesteller mit einer möglicherweise falschen Antwort zu verwirren.
-
Mal zurück zum Thema, denn auch die vermeidliche Lösung funktioniert nicht.
Ich habe folgendes geschrieben:#include <iostream> #include <vector> class Test{ int *p_int; public: Test(){ p_int = new int[10]; } ~Test(){ std::cout<<"Destrucktor:" << p_int << std::endl; delete []p_int; } }; int main(int argc, char *argv[]) { std::cout<< "Get Started !" << std::endl; getchar(); std::vector<Test> vec_1; vec_1.push_back(Test()); std::cout<< "Stage !" <<std::endl; getchar(); vec_1.pop_back(); std::cout << "Pop done !" <<std::endl; getchar(); return 0; }
Wenn mann nun den Debugger drüber laufen lässt so sieht man, dass der Destrucktor von Test noch vor << "Stage !" aufgerufen wird. Dieser wird ein zweites mal Aufgerufen bei .pop_back(), weshalb die Adresse p_int zweimal freigegeben wird :-/.
Ich denke es hat irgendwas mit dem Stack zutun aber keine Ahnung, über Hilfe würde ich mich sehr freuen.
Ich verwende den QT Creator 4.11.0
Meine Ausgabe ist:
/*- Get Started !
- Destrucktor:0x1102568
- Stage !
- Destrucktor:0x1102568
- Pop done !
*/
-
-
Guck dir die Rule of 3 an.
https://en.cppreference.com/w/cpp/language/rule_of_three
https://de.wikipedia.org/wiki/Dreierregel_(C%2B%2B)
-
@DangerSlowBrain sagte in Klasse in Vector speichern:
Definiere noch einen Kopierkonstruktor und baue in alle Konstruktoren eine Ausgabe analog zu der im Destruktor ein, dann wirst Du sehen, dass auch 2 Objekte konstruiert werden.