私は、メモリ管理のための最新のC ++の取り組みで、スマートポインタの使用をいじっています。これの一部は、一連のマップを使用して、文字列をクラス(IBlockInputと呼ばれる)に結び付け、クラスを「コンテキスト」内の現在の値に結び付けることです。2つのオプションがありますが、どちらにも同じ問題があります。
オプション1:クラスの現在の値がクラス内に保存され、コンテキストで並べ替えられます
オプション2:クラスの現在の値がコンテキスト内に保存され、クラスで並べ替えられます
ここでの問題は、どちらかのオブジェクトがもう一方のオブジェクトより先に死ぬ可能性があることです。すべての入力が残っている間にコンテキストが破棄されるか、コンテキストが残っている間に入力が破棄される可能性があります。人が死んだとき、そのための資源を解放する必要があります。私がこれまでに持っているのは(オプション2を使用して):
std::map<std::string, boost::weak_ptr<IBlockInput> > inputs;
std::map<boost::weak_ptr<IBlockInput>, boost::shared_ptr<std::vector<double> > > inputValues;
これらをこのように分離する必要がある理由は、他のクラス(IOutputBlocks)が、ポインターに基づいてIInputBlocksの値にアクセスして設定する必要があるためです。
これについて私が持っているいくつかの質問があります:
質問1:法線マップのようにinputValuesマップにアクセスし、ポインター(boost :: shared_ptr / boost :: weak_ptr ... T *ではない)を渡してアクセスできますか?それが実際の方法である場合は、weak_ptrsまたはshared_ptrsも使用できます
質問2:必要に応じてオブジェクトを停止させるために弱ポインターを使用しています(上記のオプション1を実行している場合、コンテキストを指す弱ポインターを使用する必要があります)。ウィークポインターが期限切れになり、マップでそれにアクセスしようとするとどうなりますか?それが指し示すデータは古くから失われていますか、それとも生のポインターで機能しますか?
質問3:おそらくこれを行うためのより良い方法は、生のポインターをキー/値として使用し、次に次のような弱いポインター(ある種のライブチェック用)を含む補足マップを作成することです。
std::map<std::string, IBlockInput*> inputs;
std::map<IBlockInput*, boost::shared_ptr<std::vector<double> > inputValues;
std::map<IBlockInput*, boost::weak_ptr<IBlockInput> > pointerCache;
次に、を使用して「ライブチェック」を実行し、pointerCache
doubleのベクトルを存続させ、その方法でメモリを管理する必要があるかどうかを確認できます。注:入力ベクトルは比較的頻繁に更新されます。
このための推奨される方法は何ですか?私は一般的にスマートポインターをブーストして使用するのは非常に新しいです(私は過去数か月間C#で甘やかされており、この種のことを心配する必要はありませんでした)。