2016-05-15 25 views
8

たとえば、オブジェクトを見つけてobjectが見つかった場合はshared_ptrを返す関数があり、オブジェクトが見つからなかったことを何らかの形で示す必要があります。null shared_ptrを返すのは正しいですか?

std::vector<std::shared_ptr> Storage::objects; 

std::shared_ptr<Object> Storage::findObject() 
{ 
    if (objects.find) 
    { 
    return objects[x]; 
    } 
    else 
    { 
    return nullptr; 
    } 
} 

std::shared_ptr<Object> obj = Storage::findObject(); 
if (obj) 
{ 
    print("found"); 
} 
else 
{ 
    print("not found"); 
} 
  1. 暗黙のうち、上の例のようにnullptrで初期化されたのshared_ptrを返すように、それは正しいですか?それはうまくいくでしょうが、それはこのようにすることができますか?または代わりにshared_ptrのデフォルトを返す必要がありますか?

  2. weak_ptrの場合はどうなりますか?空のweak_ptrが返されたことを確認する適切な方法は何ですか? weak_ptr :: expired関数または他の方法がありますか?もしweak_ptr :: expiredによるチェックが唯一の方法なら、どうすればその関数が空ポインタを返すか、オブジェクトがただ削除された(マルチスレッド環境)かを区別できますか?

+0

代わりに、例外 –

+1

@AndersKをスローすることです。オブジェクトが見つからない場合は、オブジェクトが見つかった場合と同様の状況になります。 –

+0

OK、例外は良い選択ではありません。 –

答えて

8

暗黙のうち、上の例のようにnullptrで初期化されたのshared_ptrを返すように、それは正しいですか?

はい、shared_ptrnullptrに初期化するのは正しいです。 nullptrshared_ptrに割り当てることも正しいです。

代わりに、代わりにshared_ptr defaultを返す必要がありますか?

あなたは両方の方法でこれを行うことができます戻っshared_ptrnullptrで初期化し、shared_ptrデフォルトを構築返します。どちらの方法も正しいですし、両方とも同じ効果があります。あなたはどんな方法でも使えます。

weak_ptrの場合はどうなりますか?空のweak_ptrが返されたことを確認する適切な方法は何ですか? weak_ptr :: expired関数または他の方法がありますか?

weak_ptrオブジェクトに関連付けられた最後shared_ptrが破棄されるたびに(期限切れになる)nullptrなります。

weak_ptrを使用する適切な方法は、shared_ptrlockメソッドに変換してから、作成したshared_ptrを使用することです。その場合、あなたのweak_ptrはあなたがその新しいshared_ptrを持っているまで期限切れになりません。 weak_ptrshared_ptrに変換しないと、いつでもweak_ptrが期限切れになることがあります。

そして、はい、新しく作成されたshared_ptrで作業をする前に、あなたはlock方法でshared_ptrを作成する前にweak_ptrの期限が切れていた可能性があるので、それは、nullでないことを確認する必要があります。

std::weak_ptr<Object> Storage::findObject(); 

... 

std::weak_ptr <Object> weak = Storage::findObject(); 
std::shared_ptr<Object> shared = weak.lock(); 
if (shared) // check that weak was not expired when we did "shared = weak.lock()" 
{ 
    // do something with shared, it will not expire. 
} 
関連する問題