objects_list.push_back(new ObjectA(this));
Dies kann zu Speicherverlust führen. Mal sehen, was passiert, wenn wir es brechen:
new ObjectA(this)
push_back
zugeordnet heißt dann
jedoch push_back
werfen kann und wenn ja, Ihr new ObjectA
ist durchgesickert.
Der Code auto_ptr
, den Sie uns zeigten, löst dieses Problem: wenn push_back
wirft, dann ist der Zeiger immer noch im Besitz von auto_ptr
und kein Leck passiert.
Die wirkliche Lösung wäre Smart-Pointer direkt statt nackter Zeiger in dem Behälter zu speichern (weil nackte Zeiger in Containern Kopfschmerzen, wenn es um die Gewährleistung der Objekte kommt richtig gelöscht werden).
Leider mit C++ 03 (wo auto_ptr
herkommt, ist es in C++ 11 veraltet) ist es nicht möglich, auto_ptr
in Containern zu speichern (das Muster ist stark beschädigt). Man könnte boost::shared_ptr
in Containern speichern oder zu C++ 11 wechseln und entweder unique_ptr
oder shared_ptr
speichern.
'std :: auto_ptr' ist nützlich. Es ist einfach nicht so brauchbar. –
Was passiert, wenn 'object_list' beim Neuaufbau auslöst? Außerdem ist 'std :: auto_ptr' C++ 03, also habe ich das C++ 11-Tag entfernt. – Xeo