【发布时间】: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