Есть ли эквивалент set_new_handler () для сбоев malloc ()? - PullRequest
5 голосов
/ 29 ноября 2010

В C ++ вы можете организовать функцию, которая будет вызываться при сбое new. Есть ли способ вызывать функцию всякий раз, когда malloc не удается? Предположим, что malloc вызывается из сторонних библиотек, которые я не хочу менять.

Я не думаю, что есть переносимый ответ, поэтому я с радостью приму ответы для конкретной платформы. Я использую Linux + uclibc на некоторых платформах и Linux + glibc на других. Я планирую использовать setrlimit для ограничения объема памяти, который может malloc вернуть.

1 Ответ

11 голосов
/ 29 ноября 2010

malloc возвращает NULL, если это не удалось. Вы должны справиться с этим и другими сбоями функций памяти CRT (особенно легко ошибиться realloc).

В общем случае, я думаю, вам придется обернуть все использование памяти ЭЛТ в свои собственные функции для перенаправления при ошибке.

В Windows вы можете подключиться к ЭЛТ, используя Функции перехвата выделения , которые могут быть способом сделать то, что вы хотите. Это дает вам возможность обработать вызовы CRT с помощью логики для onalloc, onrealloc, onfree, эффективно.

Я не даю никаких гарантий, так как я работаю в Windows, но похоже, что malloc_hook в Linux предлагает то же, что позволяет ловушка Windows. Эти методы должны позволить вам захватывать все вызовы памяти CRT без изменения кода в сторонних библиотеках, при условии, что они все используют один и тот же CRT во время выполнения - всегда хорошая идея, но не гарантируется, по крайней мере, в Windows ...

...