たとえば、オブジェクトを検索し、オブジェクトが見つかった場合は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");
}
上の例のように、nullptrで暗黙的に初期化されたshared_ptrを返すことは正しいですか?動作しますが、この方法で実行できますか?または、代わりに構築されたshared_ptrデフォルトを返す必要がありますか?
Weak_ptrになる場合はどうなりますか?空のweak_ptrが返されたことを確認する適切な方法は何ですか? weak_ptr :: expired関数によって、または他の方法はありますか? weak_ptr :: expiredによるチェックが唯一の方法である場合、関数が空のポインターを返したか、オブジェクトが削除されただけか(マルチスレッド環境)をどのように区別できますか?
上の例のようにnullptrで暗黙的に初期化されたshared_ptrを返すことは正しいですか?
はい、shared_ptr
をnullptr
で初期化することは正しいことです。 nullptr
をshared_ptr
に割り当てることも正しいです。
または、代わりに構築されたshared_ptrデフォルトを返す必要がありますか?
これは両方の方法で行うことができます。
nullptr
で初期化されたshared_ptr
を返す
return shared_ptr<Object>(nullptr);
構築されたshared_ptr
のデフォルトを返します。
return nullptr;
どちらの方法も正しく、どちらも同じ効果があります。好きなように使うことができます。
Weak_ptrになる場合はどうなりますか?空のweak_ptrが返されたことを確認する適切な方法は何ですか? weak_ptr :: expired関数によって、または他の方法はありますか?
オブジェクトに関連付けられた最後のweak_ptr
が破棄されると、shared_ptr
はnullptr
(期限切れ)になります。
weak_ptr
を使用する適切な方法は、それを lock メソッドを使用してshared_ptr
に変換し、作成されたshared_ptr
を使用することです。その場合、weak_ptr
は、新しいshared_ptr
を取得するまで有効期限が切れません。 weak_ptr
をshared_ptr
に変換しない場合、weak_ptr
はいつでも期限切れになる可能性があります。
そして、はい、新しく作成したshared_ptr
を使用する前に、lock
メソッドでweak_ptr
を作成する前にshared_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.
}