5

GCC 4.8.4 を使用して Ubuntu 14.04 を使用しており、次のようなコードがあります。

std::shared_ptr<MyClass> my_shared_object = set elsewhere...
MyFunction(*my_shared_object);

の署名MyFunctionは次のようになります。

void MyFunction(const MyClass& my_object)

完全なコードはここにあります

ただし、 my_object のコンテキスト内で実際には範囲外になることがわかっていますMyFunction。私の考えでは、は範囲外になった後、つまりが戻ったmy_shared_object後にのみコンテンツをリリースするというものでした。MyFunction私が誤解しているstd::shared_ptrのか、それとも GCC のバグなのかはわかりません。

質問は次のように要約できると思います: std::shared_ptr を逆参照すると、逆参照が使用されている限り、それが持続することが保証されますか?std::shared_ptr

4

3 に答える 3

6

意志によって管理されているものは何でも、主張を主張する人が残っstd::shared_ptrていない瞬間に破壊されます。それを参照する他のすべての方法は無関係です。std::shared_ptr

また、ローカル変数は、それぞれのスコープを離れるときにのみ破棄されます。a を逆参照しstd::shared_ptrても、それが変更されることはありません。

于 2015-11-19T19:34:32.660 に答える
4

std::shared_ptrは、保持されているオブジェクトへの参照を認識していない (または参照が を認識していない) ため、同じオブジェクトの所有権を共有しているstd::shared_ptr他の のみを認識します。std::shared_ptrしたがって、最後std::shared_ptrのオブジェクトがスコープ外になるとすぐに、オブジェクトが破棄され、ダングリング リファレンスが作成されます。

ただし、ここではそうではなくstd::shared_ptr、プログラムフローがスコープを離れた後に適切に破棄される必要があります。これは、への呼び出しの前に発生する可能性がありますMyFunction

于 2015-11-19T19:34:01.753 に答える
1

std::shared_ptr は内部参照カウントを維持します。このカウントは、オブジェクトを共有しているオブジェクトの数に対応します。shared_ptr がスコープ外になるたびに、内部参照カウントが減少します。内部参照カウントがゼロになると、メモリの割り当てが解除されます。

于 2015-11-19T19:39:58.537 に答える