C++ 11では、オブジェクトを複数のstd::shared_ptr
で管理することは可能ですか? std::shared_ptr
でオブジェクトを削除し、もう1つshared_ptr
を無効にする(空またはnullに設定する)ことは可能ですか?そうでない場合は、オブジェクトがもはや有効ではないことを他のすべての「参照」(単語の自由使用で)に知らせる最良の方法は何ですか?特定の管理対象オブジェクトに対してすべての共有ptrを無効にする
4
A
答えて
4
これを行うには、他のshared_ptr
をweak_ptr
に置き換える必要があります。削除を行うshared_ptr
は、実際にこのシナリオでオブジェクトの有効期間を管理するものです。この時点でが本当にに共有所有権セマンティクスを必要としているかどうかを判断することは価値があります。一般に、インタフェースがあなたに許さないものをしようとしていると感じたら、それは別のセマンティクスで何かが必要なことを示しています。
また、オブジェクトの有効期間を実際に1か所で管理できない場合は、shared_ptr<unique_ptr<T>>
を使用できますが、これはもっと厄介です(遅くする必要はありません)。ここでは、オブジェクトをreset
内のunique_ptr
で削除します。
1
Hereはweak_ptr
の良い例であり、他のすべての「参照」が有効でなくなったときに通知する必要があります。
#include <iostream>
#include <memory>
std::weak_ptr<int> gw;
void f()
{
std::cout << "use_count == " << gw.use_count() << ": ";
if (auto spt = gw.lock())
{ // Has to be copied into a shared_ptr before usage
std::cout << *spt << "\n";
}
else
{
std::cout << "gw is expired\n";
}
}
int main()
{
{
std::shared_ptr<int> sp = std::make_shared<int>(42);
gw = sp;
f();
}
f();
}
出力:
はuse_count == 1:42
はuse_count == 0:GWは
関連する問題
- 1. コアデータ:管理対象オブジェクトの管理対象オブジェクトコンテキストなし
- 2. 管理対象オブジェクトが有効でない - Dynamoクラッシュ
- 3. 管理対象クラスに管理対象外/非管理対象メンバーを追加する
- 4. レルムDBの管理対象/非管理対象オブジェクトとは何ですか?
- 5. マトリックスを管理対象外から管理対象に再割り当て
- 6. 管理対象/非管理対象間の移行を認識してコストを測定するC++/cli
- 7. 管理対象と非管理対象物理エンジンのC#
- 8. cudaの共有メモリと管理対象メモリの変数
- 9. 特定のクラス以外のすべてを対象にする
- 10. .Netの管理対象リソースと非管理対象リソース
- 11. Silverstripe:特定のIPに対してCSRFを無効にする
- 12. 特定のURLに対して$ httpProvider.interceptors.pushを無効にします
- 13. 管理対象外のNSManagedObjectサブクラスが通常のオブジェクトとして
- 14. 管理対象ファイルポータル
- 15. java eeアプリケーションの特定のWeblogic管理対象サーバを使用
- 16. CoreData:error:管理対象オブジェクトがコンテキストから削除された後の管理対象オブジェクトの変更
- 17. 管理対象のフィルタオブジェクト
- 18. 管理対象のC#で管理されていない無料のCコードメモリ
- 19. スレッドは処理対象のタイムスロットを共有します
- 20. Managed C++での管理対象オブジェクトの割り当て
- 21. OLEDBプロバイダは管理対象ですか、管理対象外ですか?
- 22. レルム例外 'value'は有効な管理対象オブジェクトではありません
- 23. イメージをディスクに保存して管理対象オブジェクトに関連付けるiphone
- 24. コアデータによる管理対象オブジェクトの再フォールトの防止
- 25. 混在した管理対象/非管理対象のC++/CLIプロセスシャットダウン中にスレッドがシャットダウンする
- 26. 管理対象と非管理対象のアプリ内製品の違いは?
- 27. オブジェクトグラフを使用して管理対象オブジェクトのNSMutableArrayをソートする方法
- 28. shared_ptrを使用して、すでに参照カウントされた管理対象オブジェクトを管理する方法は?
- 29. 選択したすべてのIllustratorオブジェクトを対象にするか、選択されていない場合はすべてのオブジェクトを対象にする
- 30. SNMPから管理対象オブジェクトのレジストリキーを取得する
を有効期限が切れているあなたは、常に 'shared_ptr'削除を行いますどの一つの特定の知っていますか?それとも、それは任意のものにすることができますか? – Angew
はい、私は 'shared_ptr'が削除を行うことを知っています。 – shane
間接参照のレベルを追加します。実際のオブジェクトを保持するラッパーオブジェクトを持ち、ラッパーへのポインタを共有します。時間が来ると、実際のオブジェクトを落とすようにラッパーに指示します。その時点でアクセサのエラーが報告されます(例えば 'RealObject * getReal()'から 'nullptr'を返します) –