通过 _malloca 的堆栈分配是否触发了通过 _CrtSetAllocHook 设置的 alloc 钩子

Does a stack allocation through _malloca trigger an alloc hook set through _CrtSetAllocHook

提问人:PluginPenguin 提问时间:4/30/2020 更新时间:5/4/2020 访问量:139

问:

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

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

现在,当在阈值以下分配小堆栈缓冲区时,我们会遇到堆分配断言,例如,如果不应该发生堆分配。如果决定执行堆栈分配,我找不到任何信息,如果通过设置的分配钩子也被触发,但我感觉可能是这种情况。_malloca_CrtSetAllocHook_malloca

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

visual-c++ msvcrt 堆栈分配

评论

0赞 Hans Passant 4/30/2020
一个不明显的实现细节是,当 crtdbg 处于活动状态时,malloca() 永远不会从堆栈中分配。典型的 heisenbug。
0赞 PluginPenguin 5/1/2020
哎哟,听起来像是一个解释。但是你能详细介绍一下吗?“crtdbg is active”的确切含义是什么——这是一个编译时的东西,一旦包含 crtdbg 标头就会通过宏激活,还是一个运行时的东西,一旦设置了 alloc 钩子就会被激活?您是否知道任何(Microsoft 官方)资源记录了此实现细节?
0赞 horstr 5/10/2020
“在调试模式下,_malloca始终从堆中分配内存。”马洛卡。我的理解是,这意味着应用程序已链接到调试 CRT。
0赞 Michael Chourdakis 8/28/2023
我在自己的实时音频应用程序中做的最好的事情是为实时线程使用一组预分配的缓冲区。例如,带有保留空间的 std::vector<>。

答: 暂无答案