2017-01-27 6 views
2

は、誰かが、単にこれが動作しない理由を説明してもらえ:共有ポインタと生のポインタ寿命

std::shared_pointer<Bar> getSharedPointer() { 
    return std::make_shared<Bar>(); 
} 

... 

auto foo = getSharedPointer().get(); 

getSharedPointer()によって返さ共有ポインタの寿命がありますので、どうやら生のポインタfooを使用すると、セグメンテーション違反が発生します尽きる。どういうわけか、私はスコープの終わりまで(それがどんなブロックであっても)終わりまで続くと期待しています。

これは正しいですか、この状況に類似する例がありますか?

+1

は、標準ライブラリまたは共通の第三者に記載 'getSharedPointer'を見つけることができません。何が起こるかわからない。もう少し情報を追加することをお勧めします。 – user4581301

答えて

7

getSharedPointer().get();の場合、getSharedPointer()は、式の直後に破棄される一時的なstd::shared_ptrを返し、それによって管理されるポインタも削除されます。その後、fooはぶら下がってしまいます。

auto foo = getSharedPointer().get(); 
// foo have become dangled from here 

代わりという名前の変数を使用することもできます。

auto spb = getSharedPointer(); 
auto foo = spb.get(); 
// It's fine to use foo now, but still need to note its lifetime 
// because spb will be destroyed when get out of its scope 
// and the pointer being managed will be deleted too 
+0

'spb'はスコープの終わりまで続くことに注意してください。 –

1
auto foo = getSharedPointer().get(); 

を関数は、参照でない型を返すたびに、関数の呼び出しの結果は右辺値です。また、関数getSharedPointer()はクラス型を返すため、結果は一時オブジェクトになります。

一時オブジェクトの有効期間は、一番外側の式の評価の終了として定義されます。ここではgetSharedPointer().get()です。 foo変数が初期化されると、所有するスマートポインタは破棄されます。そのオブジェクトを所有している最後のshared_ptrが破棄されると、そのオブジェクトは削除されます。

ここgetSharedPointer()は常に、管理対象オブジェクト(use_count()が1である)、最後shared_ptrのそのコピーが破壊されたときに、オブジェクトが破壊され、オブジェクトへのポインタが無効ですさを共有していないshared_ptrを返します。

(私はなぜあなたはshared_ptrではなく、ここでunique_ptrに戻ってきていることを確認していない。)

「所有」というスマートポインタ、または任意のクラスの適切な使用(の寿命を制御)他のリソース(あなたが依然として直接アクセスすることができるリソース)は、あなたがressourceにアクセスする必要がある限り、 "smart"ポインタ/所有者を生かしておくことです。

「スマートな」ポインタ(所有オブジェクト)の名前を付ける必要があります。また、読者の視点から見ると、autoというスマートなポインタであることを本当に隠そうとしているかどうかはわかりません。

std::shared_pointer<Bar> foo = getSharedPointer(); 
// use foo.get() 

あなたは、管理対象オブジェクトの正確な型非表示にすることがあります。

std::shared_pointer<auto> foo = getSharedPointer(); 
+0

独特のptrがアプリでもっと意味をなさないかどうかを確認するためにコードをもう一度参照しなければなりません。確かめます。また、あなたは、一時的なオブジェクトや生涯について知りたいことを正確に説明しましたが、これはcppで新しいことが期限切れであることについて自分自身を教育することに失敗しました。ありがとう。 – tau

関連する問題