我经常发现自己在本地使用原始指针或其他资源的容器,其中资源是动态分配的。为了确保在异常或其他返回条件的情况下不泄漏资源,我使用一个简单的包装器来容器,该容器具有释放资源的析构函数。为了将它概括为一个有用的实用程序,我想出了这个结构(请忽略模板模板参数的问题,这不是重点):
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的。有谁知道现有的解决方案吗?我可以做一个简单的修改来防止可用性错误吗?
我不能使用智能指针的向量,因为我有遗留的代码我不拥有它需要一个原始指针的容器。
答案 0 :(得分:2)
听起来Boost Pointer Container Library正是您所需要的。从动机部分:
每当程序员想要一个指向堆分配对象的容器的容器时,通常只有一种异常安全的方法:创建一个像boost :: shared_ptr这样的智能指针的容器。如果
,这种方法是次优的
存储的对象不是共享的,而是专有的,或
- 醇>
智能指针隐含的开销是不合适的
因此,该库提供了类似于标准的容器,用于存储堆分配或克隆的对象(或者在映射的情况下,映射的对象必须是堆分配或克隆的对象)。对于每个标准容器,都有一个等效的指针容器,它以异常安全的方式获取对象的所有权。