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());
}
}