Czy punkt, w którym std::map::emplace
tworzy obiekt (np. Wywołanie konstruktora) określony jakoś w standardzie? Jeśli tak, czy zdarza się przed istnienie takiego klucza jest sprawdzane lub po?W którym punkcie map :: emplace utworzymy obiekt?
Jest wiele spraw w przypadkach, jak następuje:
struct X {};
std::map<int, std::unique_ptr<X> > map;
void f(int x) {
map.emplace(x, new X);
}
Jeśli obiekt jest tworzony po pierwsze, wszystko jest cool (unique_ptr jest zbudowany i posiada zasób), ale jeśli to jest skonstruowany po sprawdzeniu, nie to przeciek pamięci w przypadku duplikatu klucza.
Wszystko udało mi się znaleźć w normie jest
wstawia obiekt VALUE_TYPE t zbudowane z
std::forward<Args>(args)...
tylko wtedy, gdy istnieje żaden element w kontenerze z kluczem odpowiednikiem klawisza t.
która nie odnosi się do pytania, które mam.
Mimo to używanie 'nowej T' na liście argumentów jest złe, więc" prawdziwą "odpowiedzią jest" Nie rób tego ". Użyj 'make_unique()' i teraz nigdy nie wycieka. –
GManNickG
W razie wypadku wystąpi wyciek, jeśli alokacja nie powiedzie się. –
Zazwyczaj nie umieszcza się inteligentnych wskaźników, ponieważ ich kopiowanie/przenoszenie jest szybkie i bezpieczne. Twoje pytanie miałoby więcej sensu, gdyby było 'map' –
Fozi