У меня есть структура данных для работы с большими наборами данных. По сути, он действует как «просмотр» данных на диске, загружая данные с диска по запросу; он попытается сохранить как можно больше данных в памяти, чтобы при следующем доступе ему не приходилось читать с диска. Когда он обнаруживает нехватку памяти, он выполняет «очистку» кусков данных со счетчиком ссылок 0. Он использует _set_new_handler (), чтобы установить функцию, которая вызывает эту очистку, когда какой-то код пытается где-то выполнить malloc () память, но может «т. Таким образом, структура данных может потреблять как можно больше памяти, но все равно «отступает», когда кому-то еще нужно немного памяти.
Теперь у меня проблема в том, что часть памяти не выделяется с помощью malloc () (или new ()). Я впервые начал видеть это в вызовах CreateDIBSection (), и я думаю, что это потому, что эта функция напрямую использует VirtualAlloc (). Таким образом, когда происходит сбой выделения, новый обработчик не вызывается, а VirtualAlloc просто отказывает. (У меня есть и другие случаи с такой же ситуацией, но те, с которыми я могу обойтись; так что CreateDIBSection () - мой основной «демонстрационный пример» проблемы; но работа с использованием этого конкретного API не решит мою общую проблему)
Так что мой вопрос - есть ли эквивалент _set_new_handler () для VirtualAlloc (), или другой способ уведомления о сбое VirtualAlloc (), чтобы я мог вызвать функцию очистки памяти и попробовать снова выделить? В качестве альтернативы, есть ли способ перехватывать вызовы VirtualAlloc (), чтобы я мог проверять доступность памяти при каждом выделении и очищать при необходимости? Спасибо.