A*
に引数として渡したいヒープが割り当てられているとしましょうboost::bind
。
boost::bind
のコンテナーのような STL で後で処理するために保存されboost::functions
ます。
A*
STLコンテナの破棄時に確実に破棄されるようにしたい。
説明するには:
A* pA = new A();
// some time later
container.push_back(boost::bind(&SomeClass::HandleA, this, pA);
// some time later
container is destroyed => pA is destroyed too
どうすればそれができますか?
編集
多分私が望んでいることはそれほど現実的ではありません。
私は生のポインタと生のポインタを受け取る関数を持っています。呼び出しはboost::bindによって遅延されます。この時点で、boost::bind を実行したい場合に備えて、自動メモリ管理が必要です。私は怠け者なので、「準備完了」のスマート ポインター ソリューションを使用したいと考えています。
std::auto_ptrは良い候補のように見えますが...
auto_ptr<A> pAutoA(pA);
container.push_back(boost::bind(&SomeClass::HandleA, this, pAutoA);
コンパイルされません (こちらを参照)
auto_ptr<A> pAutoA(pA);
container.push_back(boost::bind(&SomeClass::HandleA, this, boost::ref(pAutoA));
pAutoA が破棄され、基になる pA が削除されます。
編集 02
上記のコンテナーでは、さまざまな引数を使用してさまざまな「コールバック」を保存する必要があります。それらのいくつかは、オブジェクトへの生のポインターです。コードが古いので、いつでも変更できるとは限りません。
コールバックをコンテナーに格納するための独自のラッパーを作成することは最後の手段です (おそらく唯一の手段ですが)。