私はしばしば、リソースが動的に割り当てられるrawポインターまたは他のリソースのコンテナーをローカルで操作していることに気付きます。例外やその他の戻り条件が発生した場合にリソースがリークされないようにするために、リソースを解放するデストラクタを備えたコンテナの単純なラッパーを使用します。これを便利なユーティリティに一般化するために、私はこの構造体を思いつきました(テンプレートテンプレート引数の問題は無視してください。ここでは重要ではありません)。
template<typename Resource,
template <typename ELEM,
typename ALLOC=std::allocator<ELEM>>
class Container=std::vector>
struct ResourceContainer {
Container<Resource*> resources;
~ResourceContainer() {
std::for_each(resources.begin(), resources.end(), [](Resource* resource) {
delete resource; // more generally, use a template functor to free the resource
});
}
};
使用例:
class Bar;
void foo() {
ResourceContainer<Bar> bars;
for (int i=0; i<10; ++i) {
bars.resources.push_back(new Bar());
}
}
問題は、一般的なユーティリティとして、この構造体のスコープについて心配し始め、ユーザーがそれをコピーしたり返したりできないようにする必要があることです...一般的に、boost::scoped_ptrのように動作させたいです。誰かがこれに対する既存の解決策を知っていますか?ユーザビリティのバグを防ぐためにできる簡単な変更はありますか?
生のポインターのコンテナーを期待する自分が所有していないレガシーコードがあるため、スマートポインターのベクトルを使用できません。