2016-12-19 18 views
0

私は次のパターンが安全に使用してお勧めですか?まず、コンテナから見つかったunique_ptrを別の一時的なunique_ptrに移動し、コンテナから消去したいとします。次に、移動したポインタを使用して実際のメソッドを呼び出します。unique_ptrをコンテナから移動して消去するのは安全ですか?

高価なメソッドを呼び出しながら、コンテナ全体をロックしないようにするためです。

次の例を参照してください。

std::unordered_map<string, std::unique_ptr<Sample>> samples; 

std::unique_ptr<Sample> ptr_to_remove; 

// Lock (reader lock) samples here. 
auto it = samples.find(name); 
if (it != samples.end()) { 
    ptr_to_remove = std::move(it->second); 
    samples.erase(it); 
} 
// Unlock samples here. 

if (ptr_to_remove) { 
    ptr_to_remove->DoSomeExpensiveTask(); 
} 
+0

試したときに何が起こったのですか? –

+1

it-> secondは 'Sample'オブジェクトであり、' unique_ptr'ではありません。 'std :: unordered_map >サンプルを意味しましたか? (コードをコンパイルするため)。 –

+0

A.S.H、はい。それは正しいです:)質問を更新しました – MaxHeap

答えて

2

はい、それは安全です。

unordered_mapの値のタイプはconstではないため、変更することができます。 unique_ptrから移動することは安全です。アイテムをマップから消去すると、unique_ptrのデストラクタが呼び出され、今度は空のunique_ptrが破壊されます。これは安全です。あなたのコード例の

ザ・唯一の潜在的に危険部品は以下のとおりです。

  • コメントを約// lockスコープのロックガードを交換する必要があります。
  • これはたぶん説明のためだけのことですが、unique_ptrのローカルにDoSomeExpensiveTaskを呼び出しています(値があるかどうか最初に確認する必要はありません)。
+0

ああ、そうだ。ありがとう。質問が更新されました(ポインタに値があるかどうかを確認するコードの追加) – MaxHeap

関連する問題