4

我有一个用 Visual C++ 2010 编写的模拟引擎,我正在为另一个 3rd 方应用程序实现一个基于它的 DLL 插件。

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

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

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

谢谢, 迈克尔

4

3 回答 3

0

我将建议您检查的第一件事是您实际使用了多少堆栈空间。您是否在堆栈上分配大对象?您的程序是否利用了显着的递归深度?编写一个测试挂钩应用程序,您可以链接到您的 DLL 并检查您使用了多少堆栈空间。

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

如果您正在执行大量递归,您可能希望使用由 DLL 维护的带有基于堆的堆栈的循环进行调查,而不是依赖于应用程序的堆栈。

我提出这些建议仅仅是因为插件自包含并且不需要特殊的堆栈配置(甚至完全独立的线程只是为了拥有更大的堆栈)的侵入性要小得多。

于 2014-06-10T16:02:24.627 回答
0

我遇到了完全相同的问题,并通过生成一个具有更大堆栈大小的线程来解决它。我需要大堆栈的代码是隔离良好的设置代码,因此对我来说这是一个相当简单的解决方案。

于 2021-10-17T14:09:21.117 回答
0

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

/F 编译器: https ://docs.microsoft.com/cpp/build/reference/f-set-stack-size

/STACK 链接器: https ://docs.microsoft.com/cpp/build/reference/stack

于 2017-08-15T17:24:38.313 回答