2

私はしばしば、リソースが動的に割り当てられる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のように動作させたいです。誰かがこれに対する既存の解​​決策を知っていますか?ユーザビリティのバグを防ぐためにできる簡単な変更はありますか?

生のポインターのコンテナーを期待する自分が所有していないレガシーコードがあるため、スマートポインターのベクトルを使用できません。

4

1 に答える 1

2

Boost Pointer Container Libraryはまさにあなたが必要としているもののようです。動機セクションから:

プログラマーがヒープに割り当てられたオブジェクトへのポインターのコンテナーを持ちたい場合、通常、例外に対して安全な方法は 1 つだけです: boost::shared_ptr のようなスマート ポインターのコンテナーを作成することです。

  1. 保存されたオブジェクトは共有されていませんが、排他的に所有されています。

  2. スマート ポインターによって暗示されるオーバーヘッドが不適切である

したがって、このライブラリは、ヒープ割り当てオブジェクトまたはクローン オブジェクトを格納するための標準的なコンテナーを提供します (マップの場合、マップされたオブジェクトはヒープ割り当てオブジェクトまたはクローン オブジェクトである必要があります)。標準コンテナのそれぞれに対して、例外的に安全な方法でオブジェクトの所有権を取得する同等のポインタ コンテナがあります。

于 2012-11-01T08:34:27.563 に答える