【问题标题】:Wrapper for a container of resources资源容器的包装器
【发布时间】:2012-11-01 07:49:18
【问题描述】:

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

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

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

【问题讨论】:

  • 一开始我没有看到使用智能指针向量的问题。
  • 我忘了补充一点,由于遗留接口,使用智能指针不是一个选项,而且它们对于这个来说太重了
  • 我不知道“太重”是什么意思(这是否意味着“零开销”?),我不知道为什么你不能在保持智能指针的同时提供正确的接口下面。
  • 所以...不要使用shared_ptr?我不知道是谁提到了shared_ptr。你知道unique_ptr吗?
  • 无论如何,你看过 boost::noncopyable 吗?听起来它给了你想要的东西。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 是的,这就是我一直在寻找的东西。可悲的是,我看到了一种将实际容器(例如 std::vector)暴露给遗留代码的方法,但我认为它适用于许多其他情况。
  • @killogre:你的意思是你没有看到暴露实际容器的方法吗?遗留代码是否需要vector&lt;T&gt;(而不是提供接受迭代器范围的函数模板)?
  • 是的,我的意思是我没有看到它,是的,遗留代码不使用迭代器:(
  • 嗯。我简要地认为您可能能够制作一个特殊的allocator 来删除其指向的元素,但这会在向量的类型中起作用,这意味着它也不起作用:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2020-03-06
  • 1970-01-01
相关资源
最近更新 更多