2017-09-10 3 views
-1

マップの要素の値を関数の出力パラメータとして使用する場合は、それをスマートポインタまたはローカルとして宣言する方が良いでしょうか?例えば関数の出力パラメータのポインタまたはローカル変数

// .h 
class A { 
    private: 
    // Is the below code preferred over 
    // std::map<int, std::unique_ptr<B>>? 
    std::map<int, B> map; 
    public: 
    void Func1(); 
    // Message is the output parameter 
    void Func2(int, B* message); 
} 

// .cc 
void A:: Func1() { 
    B b; 
    // Is it better to make b a smart pointer and use std::move 
    // to transfer the ownership to map? 
    map.insert(std::make_pair(1, b)); 
    for (const auto& x : map) { 
    Func2(x->first, &x->second); 
    } 
} 

上記の例では、Bのスマートポインタを宣言し、代わりに関数func2へのポインタを渡すために良いですか?

おかげで、

+0

'B'を知らなくても良い方法はありません。 – Phil1970

答えて

3

std::mapのでmapfunc2に提供bのコピーを所有しているあなたが、それに入れるのコピーを作成します。 mapは、すべての格納されたBの破壊を処理するため、スマートポインタは必要ありません。

実際、ポインタはまったく必要ありません。 func2はとなり、参照を使用することができます。

あなたはstd::mapにポインタを格納することができ、かつstd::mapポインタのコピーが含まれます。指すデータはコピーされず、破壊を処理するための外部管理が必要です。これはスマートポインタを使用する場合には適していますが、コンテナにポインタを格納すると、最初にコンテナを使用するメリットの多くが無効になり、回避するのが最善です。

関連する問題