2

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

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正是您所需要的。从动机部分:

每当程序员想要拥有一个指向堆分配对象的指针容器时,通常只有一种异常安全的方法:制作一个智能指针容器,如 boost::shared_ptr 这种方法不是最理想的,如果

  1. 存储的对象不是共享的,而是独占的,或者

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

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

于 2012-11-01T08:34:27.563 回答