Dieser Code wird explodieren, oder? Sobald die Schleife beendet wird, werden die ursprünglichen Instanzen mit allen ihren inneren Elementen abstürzen, wenn sie also keine PODs sind, wird jede Methode wie do_stuff
, die Zugriff auf Mitglieder von B
erfordert, einen Segmentierungsfehler auslösen, richtig?Ist es nicht möglich, Instanzen in einer Schleife ohne Zeiger zu konstruieren?
void foo() {
std::vector<B> bar;
for (int i = 0; i < 7; i++)
bar.push_back(B(i, i, i));
bar[3].do_stuff();
}
Also, gibt es eine Möglichkeit, dies zu tun, ohne einen Zeiger zu verwenden? Oder haben Sie, dies zu tun haben:
void foo() {
std::vector<B*> bar;
for (int i = 0; i < 7; i++)
bar.push_back(new B(i, i, i));
bar[3]->do_stuff();
for (int i = 0; i < 7; i++)
delete bar[i];
}
Der erste Weg ist in Ordnung. Wenn Sie Java verwenden möchten, verwenden Sie 'std :: reference_wrapper'. – chris
auch fwiw Ich glaube nicht, "POD" hat etwas damit zu tun, es ist nur um die Lebensdauer der Objekte. Es ist nicht legal, Methoden für ein Objekt aufzurufen, dessen Lebensdauer abgelaufen ist, POD oder nicht –
So komisch .. Ich hatte die erste Version, bekam immer seg fault => mit Valgrind überprüft, es hieß B :: do_stuff() => in die zweite Version geändert und jetzt funktioniert es gut. Dachte auch, die erste Version sollte funktionieren. So stabil. – zehelvion