Boost.Zuweisen: unter Verwendung von Objekten mit map_list_of?
Mit C++ mit boost. Im Boost.Zuordnen kann ich die Verwendung des new-operators mit map_list_of?
Beispiel:
std::map<int, MyObject*> objects = boost::assign::map_list_of
(1, new MyObject())(2, new MyObject())(3, new MyObject())
Wenn nicht, gibt es einen anderen Weg, es zu tun?
InformationsquelleAutor User | 2011-09-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint ja. Dies kompiliert einwandfrei mit VS2010 & boost 1.47.
InformationsquelleAutor Gob00st
Es funktioniert, ja, ein Aufruf neue nur gibt einen Zeiger auf MyObject, und es kann überall eingesetzt werden, geben Sie gültig ist. JEDOCH der Aufruf von new eine Ausnahme auslösen könnte, oder MyObject Konstruktor kann eine exception werfen, was bedeutet, Ihre gesamte Karte heap-allocated MyObjects wird zugespielt werden.
Wenn Sie möchten, Ausnahme Sicherheit sowie nicht zu stören, löschen Sie diese Objekte verwenden, sollten Sie eine smart-pointer statt:
MyObject*
s nicht verwandelte sich inshared_ptr<MyObject>
s bis nachmap_list_of
erfolgt ausführen. Um exception-sicher, jedernew MyObject()
müssten ausgetauscht werden mit z.B.boost::make_shared<MyObject>()
.Sie wären absolut im Recht, wenn map_list_of war eine einzelne Funktion aufrufen; es ist tatsächlich ein Funktor-Objekt. map_list_of(1, new MyObject()); ist der Konstruktor, und die Ausnahme ist sicher; jeder, der die operator () - Aufrufe auch in Ausnahme-sicher.
auf den zweiten Gedanken, bist du hier richtig. map_list_of wird, um daraus seine zweite template-parameter als MyObject*, und undicht wird, wenn eine exception geworfen wird, bevor es fertig ist. Ich habe bearbeitet die template Parameter map_list_of so, dass es Ausnahme-sicher.
Im ernst, einfach anrufen
make_shared
auf diesen, statt.InformationsquelleAutor eplawless