vb6 - VB6 中 "Out of stack space"的可能原因

标签 vb6 stack stack-overflow

Error 28 - "Out of stack space" 的最可能原因吗?错误一个无限或非常深的递归,它使用了太多的堆栈内存?

其他可能的原因是什么?

最佳答案

您的错误描述在 here在 MSDN 中。

注:这篇 MSDN 文章与 Visual Studio 2005 相关。但很可能会说 VB6 也有同样的限制。

  • 检查过程是否嵌套太深。
  • 确保递归过程正确终止。
  • 如果局部变量需要比可用空间更多的局部变量空间,请尝试在模块级别声明一些变量。您还可以通过在 Property、Sub 或 Function 关键字前加上 Static 来声明过程中的所有变量。或者,您可以使用 Static 语句在过程中声明各个静态变量。
  • 将一些固定长度的字符串重新定义为可变长度的字符串,因为固定长度的字符串比可变长度的字符串使用更多的堆栈空间。您还可以在不需要堆栈空间的模块级别定义字符串。
  • 检查嵌套 DoEvents 函数调用的数量,方法是使用“调用”对话框查看堆栈上哪些过程处于事件状态。
  • 确保您没有通过触发调用堆栈上已经存在的事件过程的事件而导致“事件级联”。事件级联类似于未终止的递归过程调用,但不太明显,因为调用是由 Visual Basic 进行的,而不是代码中的显式调用。使用“调用”对话框查看堆栈中哪些过程处于事件状态。

  • [更新]

    您可以在 here 上找到 Visual Studio 6 (VB6) 文章。 .
  • 您有太多事件的 Function、Sub 或 Property 过程调用。
    检查过程没有嵌套太深。对于递归过程尤其如此,即调用自身的过程。确保递归过程正确终止。使用调用对话框查看哪些过程是事件的(在堆栈上)。
  • 您的局部变量需要比可用空间更多的局部变量空间。
    尝试在模块级别声明一些变量。您还可以通过在 Property、Sub 或 Function 关键字前加上 Static 来声明过程中的所有变量。或者,您可以使用静态语句在过程中声明各个静态变量。
  • 您有太多固定长度的字符串。
    过程中的固定长度字符串访问速度更快,但比可变长度字符串使用更多的堆栈空间,因为字符串数据本身放在堆栈上。尝试将一些固定长度的字符串重新定义为可变长度的字符串。在过程中声明可变长度字符串时,只有字符串描述符(而不是数据本身)放在堆栈上。您还可以在不需要堆栈空间的模块级别定义字符串。在模块级别声明的变量默认是公共(public)的,因此该字符串对模块中的所有过程都是可见的。
  • 您有太多嵌套的 DoEvents 函数调用。
    使用“调用”对话框查看堆栈中哪些过程处于事件状态。
  • 您的代码触发了事件级联。
    事件级联是由触发一个调用已经在堆栈上的事件过程的事件引起的。事件级联类似于未终止的递归过程调用,但不太明显,因为调用是由 Visual Basic 进行的,而不是通过代码中的显式调用。使用调用对话框查看哪些过程是事件的(在堆栈上)。
  • 关于vb6 - VB6 中 "Out of stack space"的可能原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9920364/

    相关文章:

    VB6 构建后崩溃

    variables - 为什么在一个 VB6 项目中声明的全局变量不能在同一个 VB6 项目组的另一个项目中编译?

    ubuntu - 在 Ubuntu 11.10 上粉碎堆栈

    c - C中递归程序中的堆栈溢出问题

    sql-server - 从 VBA 执行 SQL Server SP - 参数错误

    c# - 将 GUI 组件添加到预编译的应用程序

    java - 堆栈中的内存分配和局部变量的删除

    c - 如何使用链表初始化堆栈

    java - 为什么我的代码会导致java中的堆栈溢出错误?它最终应该终止。 for循环版本不会导致错误

    java - 线程中的异常 "main"java.lang.StringIndexOutOfBoundsException : String index out of range: -3