我正在尝试使用自定义新处理程序来响应我使用Eigen库的程序中的内存不足错误。
当我解决一个实例时,我缓存了结果(一个大的动态大小向量),所以如果我需要再次解决那个实例,我已经有了结果。一段时间后,可能会缓存太多实例,因此在计算过程中没有足够的内存。在这种情况下,我会清空缓存(或者最好删除一些实例)。
我想出的最简单的方法是拥有一个全局变量std::map<InputType, ResultType> cache
,并安装一个清空它的新处理程序(除非它已经为空,否则它会退回到默认处理程序)。这样,当分配失败时,我的处理程序会释放一些内存并返回,因此会再次尝试分配内存。
然而,似乎从未调用过这样的处理程序,而是std::bad_alloc
总是抛出异常。
我试过这个取自这里的例子。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 一起使用?还是我必须在高级别的地方捕获异常,清除缓存,然后再次执行计算?