C++ 资源容器的包装器

C++ 资源容器的包装器,c++,memory-management,boost,c++11,C++,Memory Management,Boost,C++11,我经常发现自己在本地使用原始指针或其他资源的容器,这些资源是动态分配的。为了确保在出现异常或其他返回条件时不会泄漏资源,我为容器使用了一个简单的包装器,该容器具有释放资源的析构函数。为了将其推广到一个有用的实用程序中,我提出了这个结构(请忽略模板参数的问题,这不是重点): 模板 结构资源容器{ 集装箱资源; ~ResourceContainer(){ std::for_each(resources.begin()、resources.end()、[](Resource*Resource){ 删除

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

模板
结构资源容器{
集装箱资源;
~ResourceContainer(){
std::for_each(resources.begin()、resources.end()、[](Resource*Resource){
删除资源;//更一般地说,使用模板函子释放资源
});
}
};
示例用法:

class Bar;
void foo() {
    ResourceContainer<Bar> bars;
    for (int i=0; i<10; ++i) {
        bars.resources.push_back(new Bar());
    }
}
类条;
void foo(){
资源容器条;
对于(int i=0;i来说,这听起来正是您所需要的。从动机部分:

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

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

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

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


    首先,我不认为使用智能指针向量有什么问题。我忘了补充说,由于传统接口,使用智能指针不是一个选项,而且它们的负载太重。我不知道“负载太重”意味着什么(它是否意味着“零开销”?),我不知道为什么你不能在保持智能指针的同时提供正确的界面。所以…不要使用
    shared\u ptr
    ?我不知道谁提到了
    shared\u ptr
    。你知道
    unique\u ptr
    ?不管怎样,你看过boost::noncopyable吗?听起来它给了你想要的东西。是的,这是ki很遗憾,我看到了一种向遗留代码公开实际容器(比如std::vector)的方法,但我看到它在许多其他情况下都能工作。@killogre:你是说你没有看到一种公开实际容器的方法吗?遗留代码是否期望一个
    vector
    (比如说,不是提供采用迭代器范围的函数模板)?是的,我的意思是我看不到它,是的,遗留代码不采用迭代器:(嗯,我简单地认为您可能能够创建一个特殊的
    分配器
    ,删除其指向的元素,但这将进入向量的类型,这意味着它也不起作用:(
    class Bar;
    void foo() {
        ResourceContainer<Bar> bars;
        for (int i=0; i<10; ++i) {
            bars.resources.push_back(new Bar());
        }
    }