2016-09-20 5 views
0

私は、stdライブラリのshared_ptrのようなスマートポインタを使いたいと思っていましたが、 を共有するすべてのshared_ptrのオブジェクトを削除することが可能です。 これらのポインタは削除しないでください。shared_ptrオブジェクトグローバル削除

例えば

私がのstd :: shared_ptrの

shared_ptr<A> p1 = make_share<A>(); 
shared_ptr<A> p2 = shared_ptr<A>(p1); 
p1.reset(); 
// now p2 still contain the object of type A 
// instead of nullptr 

それをする方法はありますかいくつかの選択肢が存在しない使用している場合は?それは間違っているのですか?

+0

これは間違っているようです。 shared_ptrの目的は、誰もそれを使わなくなったときにだけオブジェクトが破壊されることです。だからあなたはしたいことを抑止しようとしているポインタの種類を使用しています。 – Hayt

+1

あなたの記述があなたのコード例と矛盾しているようですか?共有ポインターは、コーディングの例に従って既に機能しています。 – Galik

+0

Sry、私の説明が悪いかもしれません。私は、p1がp1.reset()の後にnullptrになるようにするshared_ptrとして何か他のものが存在することを意味していましたか? – pepece

答えて

3

絶対に。 std::shared_ptrには、std::weak_ptrがあり、std::shared_ptrのセットで管理されているオブジェクトを指すポインタが存在し、オブジェクトがまだ有効かどうかを確認できますが、オブジェクトの有効期間は延長されません。

オリジナルのstd::shared_ptrをオブジェクトに保存し、そのオブジェクトの他のユーザーにstd::weak_ptrを貸してください。オブジェクトを破壊する必要がある場合は、std::shared_ptrをリセットし、残っているものはすべてstd::weak_ptrで、ユーザーがロックしようとするとnull std::shared_ptrが返されます。

+0

良いアイデア。それは私が探していたもののようなものです。唯一の問題は、コードを使用する唯一の人ではないかもしれないということです。作成した 'shared_ptr'を' weak_ptr'を除いてコピーすることができないようにする方法がありますか? – pepece

+0

@pepece他のユーザーが 'std :: shared_ptr'を作成できないようにすることはできますか?すぐには使えませんが、 'std :: weak_ptr'だけを公開しているAPIは、ロックされたポインタを必要以上に長く保持してはならないことを明確に示しています。 'std :: weak_ptr'の周りにラッパーを書くことで、非可動ロックオブジェクトを作成することができます。 – Quentin

+0

正確に。あなたが何を意味しているのか分からないので、std :: reference_wrapperについて話していますか? – pepece

関連する問題