Ist der Punkt, an dem std::map::emplace
erstellt das Objekt (d. H. Aufruf des Konstruktors) irgendwie in Standard angegeben? Wenn ja, passiert es vor Vorhandensein eines solchen Schlüssels überprüft oder nach?An welchem Punkt erstellt map :: emplace ein Objekt?
Es spielt eine große Rolle in den Fällen wie folgt vor:
struct X {};
std::map<int, std::unique_ptr<X> > map;
void f(int x) {
map.emplace(x, new X);
}
Wenn das Objekt zum ersten Mal erstellt wird, werden alle cool (unique_ptr ist so aufgebaut und besitzt die Ressource), aber wenn es nach der Prüfung aufgebaut ist, gibt ist ein Speicherverlust im Falle eines doppelten Schlüssels.
Alles in Standard-finden Ich war in der Lage ist
Fügt ein t value_type Objekt konstruiert mit
std::forward<Args>(args)...
, wenn und nur wenn kein Element in der zu dem Schlüssel von t Behältern mit Schlüssel entspricht.
was nicht die Frage, die ich habe.
Die Verwendung von 'new T' in einer Argumentliste ist sowieso schlecht, also lautet die" echte "Antwort Do not Do That. Verwenden Sie 'make_unique()' und jetzt leckt es nie. –
GManNickG
In jedem Fall tritt ein Leck auf, wenn die Zuweisung fehlschlägt. –
Sie platzieren Smart Pointer normalerweise nicht, weil das Kopieren/Verschieben schnell und sicher ist. Ihre Frage würde mehr Sinn ergeben, wenn es sich um eine 'map' –
Fozi