我正嘗試使用自定義新處理程序來響應在使用Eigen庫的程序中發生的內存不足錯誤。當我解決一個實例時,我緩存結果(一個大的動態的大小向量),所以如果我需要再次解決這個實例,我已經有了結果。一段時間後,可能會發生太多實例被緩存,所以在計算過程中沒有足夠的內存。在這種情況下,我會清空緩存(或者更好地移除一些實例)。與特徵庫一起使用自定義新處理程序
我想出的最簡單的方法是有一個全局變量std::map<InputType, ResultType> cache
,並安裝一個新的處理程序清空它(除非它已經是空的,然後回落到默認處理程序)。通過這種方式,當分配失敗時,我的處理程序釋放一些內存並返回,因此嘗試分配內存。
但是,似乎這樣的處理程序永遠不會被調用,而總是拋出一個std::bad_alloc
異常。我試過here這個例子。當使用std::vector<int>
時,正確調用自定義處理程序,並打印「內存分配失敗,終止」。當使用時,我只有一個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';
}
}
我不知道爲什麼會這樣,也許徵不使用operator new
分配內存?我在文檔中找不到任何東西。有沒有辦法與Eigen一起使用這種技術?或者我必須在高級別捕獲異常,清除緩存並再次執行計算?
感謝您的建議,我設法實現了我一直在尋找的行爲。我發佈了一個包含細節的新答案。 – Claudio