std::map::emplace
が何らかの形で標準で指定されたオブジェクト(つまりコンストラクタを呼び出す)を作成するポイントですか?はいの場合は、の前にそのようなキーの存在をチェックしたのですか?map :: emplaceはどの時点でオブジェクトを作成しますか?
それは次のような場合に多くの重要:
struct X {};
std::map<int, std::unique_ptr<X> > map;
void f(int x) {
map.emplace(x, new X);
}
オブジェクトが最初に作成されている場合は、すべてが、(unique_ptrをを構築し、リソースを所有している場合)涼しいですが、それはチェックの後に構築されている場合重複キーの場合のメモリリークです。
I標準で見つけることができたすべての
挿入VALUE_TYPEオブジェクトtがあれば
std::forward<Args>(args)...
で構築およびtの鍵の鍵と等価と 容器には要素が存在しない場合のみです。
私は持っている質問には対応していません。
引数リストに 'new T 'を使うのはとにかく悪いので、"本当の "答えはそれをしないでください。 'make_unique()'を使うと、漏れてしまうことはありません。 –
GManNickG
割り当てが失敗した場合は、どのイベントでもリークが発生します。 –
スマートポインタのコピーや移動は高速かつ安全なので、通常はスマートポインタを無効にしません。もしあなたが 'map ' –
Fozi