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

CJ7*_*CJ7 3 stack-overflow vb6 stack

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

其他可能的原因是什么?

Mar*_*tin 5

描述了你的错误在这里在MSDN.

注意:这篇MSDN文章与Visual Studio 2005有关.但是可能会说VB6的限制相同.

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

[更新]

您可以在此处找到Visual Studio 6(VB6)文章.

  • 您有太多活动的Function,Sub或Property过程调用.检查程序是否嵌套得太深.对于递归过程,即调用自身的过程尤其如此.确保递归过程正确终止.使用"调用"对话框可以查看哪些过程处于活动状态(在堆栈上).
  • 您的局部变量需要比可用空间更多的局部变量空间.尝试在模块级别声明一些变量.您还可以通过在Property,Sub或Function关键字前加上Static来声明过程中的所有变量.或者,您可以使用Static语句在过程中声明各个静态变量.
  • 你有太多固定长度的字符串.过程中的固定长度字符串可以更快地访问,但比可变长度字符串使用更多的堆栈空间,因为字符串数据本身放在堆栈上.尝试将一些固定长度的字符串重新定义为可变长度字符串.在过程中声明可变长度字符串时,只将字符串描述符(而不是数据本身)放在堆栈上.您还可以在模块级别定义不需要堆栈空间的字符串.默认情况下,在模块级别声明的变量为Public,因此该字符串对模块中的所有过程都是可见的.
  • 您有太多嵌套的DoEvents函数调用.使用"调用"对话框可以查看堆栈上处于活动状态的过程.
  • 您的代码触发了事件级联.事件级联是由触发调用已在堆栈上的事件过程的事件引起的.事件级联类似于未终止的递归过程调用,但它不太明显,因为调用是由Visual Basic而不是代码中的显式调用.使用"调用"对话框可以查看哪些过程处于活动状态(在堆栈上).

  • +1"事件级联"可能很难发现.有时您有一个事件处理程序可以更改控件的无害属性 - 但该属性更改会再次触发事件.(或者它触发另一个事件,它会改变不同的属性......最终你会回到初始属性). (2认同)