包装容器的资源

时间:2012-11-01 07:49:19

标签: c++ memory-management boost c++11

我经常发现自己在本地使用原始指针或其他资源的容器,其中资源是动态分配的。为了确保在异常或其他返回条件的情况下不泄漏资源,我使用一个简单的包装器来容器,该容器具有释放资源的析构函数。为了将它概括为一个有用的实用程序,我想出了这个结构(请忽略模板模板参数的问题,这不是重点):

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的。有谁知道现有的解决方案吗?我可以做一个简单的修改来防止可用性错误吗?

我不能使用智能指针的向量,因为我有遗留的代码我不拥有它需要一个原始指针的容器。

1 个答案:

答案 0 :(得分:2)

听起来Boost Pointer Container Library正是您所需要的。从动机部分:

  

每当程序员想要一个指向堆分配对象的容器的容器时,通常只有一种异常安全的方法:创建一个像boost :: shared_ptr这样的智能指针的容器。如果

,这种方法是次优的      
      
  1. 存储的对象不是共享的,而是专有的,或

  2.   
  3. 智能指针隐含的开销是不合适的

  4.         

    因此,该库提供了类似于标准的容器,用于存储堆分配或克隆的对象(或者在映射的情况下,映射的对象必须是堆分配或克隆的对象)。对于每个标准容器,都有一个等效的指针容器,它以异常安全的方式获取对象的所有权。