可能是VB6中“堆栈空间不足”的原因

时间:2012-03-29 06:48:02

标签: vb6 stack stack-overflow

最有可能导致Error 28 - "Out of stack space"错误的无限或非常深的递归会占用过多的堆栈内存?

其他可能的原因是什么?

4 个答案:

答案 0 :(得分:5)

您的错误在MSDN中的here上进行了描述。

注意:此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来声明过程中的所有变量。或者,您可以使用Static语句在过程中声明各个静态变量。
  • 你有太多固定长度的字符串。 过程中的固定长度字符串可以更快地访问,但比可变长度字符串使用更多的堆栈空间,因为字符串数据本身放在堆栈上。尝试将一些固定长度的字符串重新定义为可变长度字符串。在过程中声明可变长度字符串时,只将字符串描述符(而不是数据本身)放在堆栈上。您还可以在模块级别定义不需要堆栈空间的字符串。默认情况下,在模块级别声明的变量为Public,因此该模块中的所有过程都可以看到该字符串。
  • 您有太多嵌套的DoEvents函数调用。 使用“调用”对话框可以查看堆栈中处于活动状态的过程。
  • 您的代码触发了事件级联。 事件级联是由触发调用已在堆栈上的事件过程的事件引起的。事件级联类似于未终止的递归过程调用,但它不那么明显,因为调用是由Visual Basic而不是代码中的显式调用完成的。使用“调用”对话框可以查看哪些过程处于活动状态(在堆栈上)。

答案 1 :(得分:4)

我有一个案例而不是:

Public Property Let EmployeeNo(ByVal vdata As String)
    mvarEmployeeNo = vdata
End Property

我错了:

Public Property Let EmployeeNo(ByVal vdata As String)
    EmployeeNo = vdata
End Property

答案 2 :(得分:0)

是的,这是最可能的原因。

答案 3 :(得分:0)

我知道这是一个老问题,但我偶然发现在这里试图弄清楚我的情况,并发现它是一些遗留的debug.print语句,我引起了这个。它们是在我在表单中的GridText事件的循环中生成的,我猜测它会占用所有堆栈空间。