使用RAII在给定次数的迭代后重新分配资源
Using RAII to re-allocate a resource after a given number of iterations
我需要处理大量的项目。为此,需要一个资源,在这种情况下,该资源是一个外部软件程序。
由于外部软件的内存泄漏,不可能用一个资源实例处理所有项目。出于性能原因,不能选择创建资源的新实例。因此,我需要处理给定大小N的部分项目。这意味着我创建一个资源实例,处理接下来的N个项目,然后释放资源。重复此过程,直到处理完所有项目。
项目的处理实际上是一个复杂的过程,可能会导致不同类型的故障(异常(。因此,我喜欢使用RAII习惯用法来管理资源,并确保每个实例都被干净地释放。
用两个嵌套循环来实现这一点并没有什么大不了的,如本例所示:
#include <iostream>
#include <vector>
class ResourceAllocator {
public:
ResourceAllocator() { std::cout << "Allocating resourcen"; }
~ResourceAllocator() { std::cout << "Deallocating resourcen"; }
void Process(int n) { std::cout << "Processing item " << n << "n"; }
};
int main()
{
const int totalSize = 20;
const int portionSize = 6;
std::vector<int> items(totalSize);
int count = 0;
bool complete = false;
while (!complete) {
ResourceAllocator a;
for (int i = 0; i < portionSize; i++) {
a.Process(items[i]);
count++;
if (count >= totalSize) {
complete = true;
break;
}
}
}
}
然而,我一直在想,是否有一种解决方案只需要一个循环。
我创建一个资源实例,处理接下来的N个项目,然后取消分配资源。重复此过程,直到处理完所有项目。
您可以使用移动语义来转移资源的所有权。当遵循RAII习惯用法的对象成为移动分配的目标时,它会释放其拥有的资源(如果有的话(,并获得分配给它的资源的所有权——分配操作的来源:
Resource r(/* 1st resource */);
// ...
r = Resource(/* 2nd resource */);
分配应该释放r
拥有的资源,并获得正在创建的新资源(即Resource(/* 2nd resource */)
(的所有权。
您应该为类实现移动赋值运算符。处理完对象后,将使用这些对象作为移动指定的目标。
另一种选择是使用该值的容器,并每N次迭代重置一次。
#include <iostream>
#include <vector>
#include <optional>
class ResourceAllocator {
public:
ResourceAllocator() { std::cout << "Allocating resourcen"; }
~ResourceAllocator() { std::cout << "Deallocating resourcen"; }
void Process(int n) { std::cout << "Processing item " << n << "n"; }
};
int main()
{
const int totalSize = 20;
const int portionSize = 6;
std::vector<int> items(totalSize);
{
std::optional<ResourceAllocator> a;
for (int i = 0; i < items.size(); ++i)
{
if (i % portionSize == 0) a.emplace();
a->Process(items[i]);
}
}
}
相关文章:
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为模板参数类型中的新对象分配内存
- 新运算符分配的大小大于声明的大小.为什么
- 在C++中分配分配
- 为什么支撑初始化分配分配填充垃圾变量
- C 新操作员分配新内存
- 新不分配内存?
- 如果我的C++“新”内存分配失败,如何找出返回值
- 我可以用新的分配内存块吗?
- COM / DCOM:服务器存根不会为现有接口中的新方法分配内存
- 在线程在 C++ 中完成后将新任务分配给线程
- 只能使用CUDA中的新运算符分配有限的内存
- 与将新内容分配给向量的指针斗争
- 确定C++中新运算符分配的内存大小
- 按新内存分配
- 是否有必要使用 'new' 将新指针分配给与指向同一结构的先前存在的指针相同的结构?如果是这样,为什么?
- 用于新运算符分配的公共内存
- boost::io_service post方法是否引起新的分配?
- 如何在C++中检索由新运算符分配的对象的地址