首页 > 解决方案 > 通过 _malloca 的堆栈分配是否会触发通过 _CrtSetAllocHook 设置的分配挂钩

问题描述

对于实时音频信号处理应用程序,我们希望确保实时线程中不会执行堆内存分配。作为开发过程中使用的内部调试工具,我们设置了一个堆分配钩子函数,通过_CrtSetAllocHook它检查分配线程的线程ID并断言它是否是实时线程。

在我们代码库的某些部分,我们现在使用_malloca/_freea来临时创建 < 400 字节的堆栈缓冲区。根据Microsoft 文档_malloca当分配的字节数大于定义的值时,执行堆分配而不是堆栈分配_ALLOCA_S_THRESHOLD_ALLOCA_S_THRESHOLD当前设置为 1024。

我们现在在分配低于阈值的小堆栈缓冲区时遇到堆分配断言_malloca,例如,如果不应该发生堆分配。_CrtSetAllocHook如果在决定执行堆栈分配的情况下也触发了通过设置的分配挂钩,我没有找到任何信息_malloca,但我觉得可能是这种情况。

所以第一个问题:有没有人找到任何关于这里可以预期的行为的官方文档?第二个问题:如果我假设的堆栈和堆分配都调用了 alloc 挂钩,那么我们应该如何确定执行哪种分配只触发堆分配的断言?

标签: visual-c++msvcrtstack-allocation

解决方案


推荐阅读