Для приложения обработки аудиосигнала в реальном времени мы хотим убедиться, что выделение динамической памяти не выполняется из потоков реального времени. Как инструмент внутренней отладки, используемый во время разработки, мы настраиваем функцию ловушки выделения кучи через _CrtSetAllocHook
, которая проверяет идентификатор потока выделяющего потока и утверждает, является ли он потоком реального времени.
В некоторых частях нашего кодовая база теперь мы используем _malloca
/ _freea
для временного создания стековых буферов <400 байт. Согласно <a href="https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/malloca?view=vs-2019" rel="nofollow noreferrer"> документации Microsoft , _malloca
выполняет выделение кучи вместо выделения стека, когда количество выделенных байтов больше значения, определенного _ALLOCA_S_THRESHOLD
. _ALLOCA_S_THRESHOLD
в настоящее время установлено на 1024.
Теперь мы сталкиваемся с утверждением выделения кучи, когда _malloca
выделяет небольшие буферы стека под порогом, например, если не должно быть выделения кучи. Я не нашел никакой информации, если ловушка выделения, установленная через _CrtSetAllocHook
, также запускается в случае, если _malloca
решит выполнить выделение стека, но у меня есть ощущение, что это может иметь место.
Итак, первые вопросы: найдет ли кто-нибудь официальную документацию о поведении, которое можно ожидать здесь? Второй вопрос: если ловушка allo c вызывается как для размещения в стеке, так и в куче, как я предполагаю, как тогда мы должны выяснить, какой тип распределения был выполнен, чтобы вызвать утверждение только для распределений кучи?