Visual c++ 通过malloca进行堆栈分配是否会触发通过CrtSetAllocHook设置的alloc钩子
对于实时音频信号处理应用程序,我们希望确保不从实时线程中执行堆内存分配。作为开发过程中使用的内部调试工具,我们通过Visual c++ 通过malloca进行堆栈分配是否会触发通过CrtSetAllocHook设置的alloc钩子,visual-c++,msvcrt,stack-allocation,Visual C++,Msvcrt,Stack Allocation,对于实时音频信号处理应用程序,我们希望确保不从实时线程中执行堆内存分配。作为开发过程中使用的内部调试工具,我们通过\u CrtSetAllocHook设置了一个堆分配钩子函数,该函数检查分配线程的线程ID并断言它是否是实时线程 在代码库的某些部分,我们现在使用\u malloca/\u freea临时创建
\u CrtSetAllocHook
设置了一个堆分配钩子函数,该函数检查分配线程的线程ID并断言它是否是实时线程
在代码库的某些部分,我们现在使用\u malloca
/\u freea
临时创建<400字节的堆栈缓冲区。根据\u malloca当分配的字节数大于\u ALLOCA\u S\u阈值定义的值时,执行堆分配而不是堆栈分配<代码>\u ALLOCA\u S\u阈值当前设置为1024
现在,当\u malloca
在阈值下分配小堆栈缓冲区时(例如,如果不应该进行堆分配),我们会运行heap allocation断言。如果在\u malloca
决定执行堆栈分配时,通过\u CrtSetAllocHook
设置的分配挂钩也被触发,我没有找到任何信息,但我感觉可能是这样的
第一个问题是:有没有人找到任何关于这种行为的官方文件?
第二个问题:如果像我假设的那样为堆栈和堆分配调用alloc钩子,那么我们应该如何确定执行了哪种分配以仅触发堆分配断言?一个不明显的实现细节是,当crtdbg处于活动状态时,malloca()将永远不会从堆栈分配。典型的海森堡。哎哟,听起来像个解释。但你能说得更详细一点吗?“crtdbg处于活动状态”的确切含义是什么?这是一个编译时的东西,在包含crtdbg头时通过宏激活,还是一个运行时的东西,在设置alloc钩子时激活?您知道有任何(微软官方)资源记录了这个实现细节吗?“在调试模式下,_malloca总是从堆中分配内存。”。我的理解是,这意味着应用程序是针对调试CRT链接的。一个不明显的实现细节是,当crtdbg处于活动状态时,malloca()将永远不会从堆栈中进行分配。典型的海森堡。哎哟,听起来像个解释。但你能说得更详细一点吗?“crtdbg处于活动状态”的确切含义是什么?这是一个编译时的东西,在包含crtdbg头时通过宏激活,还是一个运行时的东西,在设置alloc钩子时激活?您知道有任何(微软官方)资源记录了这个实现细节吗?“在调试模式下,_malloca总是从堆中分配内存。”。我的理解是,这意味着应用程序是针对调试CRT链接的。