我经常发现自己使用原始指针或其他资源的容器在本地工作,其中资源是动态分配的。为了确保在发生异常或其他返回条件时不会泄漏资源,我为容器使用了一个简单的包装器,该容器具有释放资源的析构函数。为了将其概括为一个有用的实用程序,我想出了这个结构(请忽略模板模板参数的问题,这不是重点):
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。有谁知道这方面的现有解决方案?我可以做一个简单的修改来防止可用性错误?
我不能使用智能指针向量,因为我不拥有需要原始指针容器的遗留代码。