当DLL需要比主exe应用程序更大的堆栈大小时,该怎么办? 我有一个Visual C++ 2010编写的仿真引擎,我正在为另一个第三方应用程序实现一个DLL插件。

当DLL需要比主exe应用程序更大的堆栈大小时,该怎么办? 我有一个Visual C++ 2010编写的仿真引擎,我正在为另一个第三方应用程序实现一个DLL插件。,c++,visual-c++,dll,stack,stack-size,C++,Visual C++,Dll,Stack,Stack Size,但是,当第三方应用程序的线程调用我的库时,我会遇到堆栈溢出错误。调试后,DLL需要比线程更大的堆栈大小。是否可以以某种方式扩展当前线程的堆栈大小 我知道我可能应该检查模拟引擎的代码并将大对象移动到堆中。问题是引擎由另一个供应商维护,如果可能的话,我希望避免修改他们的代码 我正在考虑在DLL中创建我自己的具有更大堆栈大小的线程,并在计算完成后将结果返回给调用线程。这是正确的方法吗 谢谢, Michal我建议首先检查实际使用的堆栈空间。是否在堆栈上分配大型对象?您的程序是否利用了重要的递归深度?编写

但是,当第三方应用程序的线程调用我的库时,我会遇到堆栈溢出错误。调试后,DLL需要比线程更大的堆栈大小。是否可以以某种方式扩展当前线程的堆栈大小

我知道我可能应该检查模拟引擎的代码并将大对象移动到堆中。问题是引擎由另一个供应商维护,如果可能的话,我希望避免修改他们的代码

我正在考虑在DLL中创建我自己的具有更大堆栈大小的线程,并在计算完成后将结果返回给调用线程。这是正确的方法吗

谢谢,
Michal

我建议首先检查实际使用的堆栈空间。是否在堆栈上分配大型对象?您的程序是否利用了重要的递归深度?编写一个可以链接到DLL中的测试钩子应用程序,并检查使用了多少堆栈空间

如果在堆栈上分配大型对象,我强烈建议将它们移动到堆中

如果您正在执行重要的递归,您可能希望研究使用一个循环,该循环具有由DLL维护的基于堆的堆栈,而不是依赖于应用程序的堆栈


我提出这些建议的原因很简单,因为插件是自包含的,不需要特殊的堆栈配置(甚至不需要一个完全分离的线程来拥有一个更大的堆栈),这对插件的干扰要小得多。

Visual Studio为您提供了两个更改默认堆栈大小(1MB)的选项:

/F对于编译器:

/链接器的堆栈:

“我的DLL似乎需要比线程更大的堆栈大小。”您调试过这个吗?线程的堆栈大小是否异常小?默认堆栈大小(1MB)非常大。如果您正在溢出,我将检查函数范围中声明的失控递归或大缓冲区。如果堆栈上有较大的缓冲区,请尝试将它们移动到堆中。创建自己的线程是获得更大堆栈的一种方法,但请注意,您可能只是隐藏了一个真正的bug或设计缺陷。我编辑了答案-是的,我调试了它。它有默认的堆栈大小,但是代码在堆栈上分配了大的缓冲区和数据结构,并且需要大约10mb的堆栈。是的,我可以把这些东西移到堆中,但我想知道替代方案,因为我想避免仅仅因为第三方应用程序的堆栈较小而修改模拟模型的核心。对。但我正在集成另一个供应商的代码,我希望避免修改它。在某些情况下,无法控制堆栈的使用,只需要稍微增加分配就可以使事情正常进行。我在这里写了一个插件包装器,它将一个我无法控制的dll粘贴到具有默认大小堆栈分配的外部应用程序。我可以用editbin修复可执行文件的个人副本,但我不知道如何将该解决方案应用于插件的用户。我可以访问模拟引擎的源代码,但它由另一家供应商“拥有”,我想知道我是否可以在不修改其代码的情况下做些什么。