【发布时间】:2012-10-13 14:59:35
【问题描述】:
我正在尝试使用自定义新处理程序来响应我使用 Eigen 库的程序中的内存不足错误。
当我解决一个实例时,我会缓存结果(一个大的 动态 大小的向量),所以如果我需要再次解决那个实例,我已经有了结果。一段时间后,可能会缓存太多实例,因此在计算过程中没有足够的内存。在这种情况下,我会清空缓存(或者最好删除一些实例)。
我想出的最简单的方法是拥有一个全局变量std::map<InputType, ResultType> cache,并安装一个清空它的新处理程序(除非它已经是空的,否则它会使用默认处理程序)。这样,当分配失败时,我的处理程序会释放一些内存并返回,因此会再次尝试分配内存。
但似乎从未调用过此类处理程序,而是始终抛出 std::bad_alloc 异常。
我尝试了这个取自here 的示例。使用std::vector<int> 时,自定义处理程序被正确调用,并打印“内存分配失败,终止”。使用Eigen::VectorXi 时,我只得到了std::bad_alloc 异常。
#include <Eigen/Dense>
#include <iostream>
#include <vector>
#include <new>
void handler()
{
std::cout << "Memory allocation failed, terminating\n";
std::set_new_handler(nullptr);
}
int main()
{
std::set_new_handler(handler);
try {
while(true) {
const unsigned long int Size = 100000000ul;
// Either one of the following:
// new Eigen::VectorXi(Size);
new std::vector<int>(Size);
}
} catch (const std::bad_alloc & e) {
std::cout << e.what() << '\n';
}
}
我想知道为什么会这样,也许 Eigen 不使用operator new 来分配内存?我在文档中找不到任何内容。有没有办法将这种技术与 Eigen 一起使用?还是我必须在高层捕获异常,清除缓存,然后再次执行计算?
【问题讨论】:
标签: c++ new-operator eigen