
1、因为堆栈溢出意味着堆内存已耗尽,如果只是简单地用on error resume next语句忽略并继续向下执行,轻则程序运行会出现异常,重则会导致系统奔溃。
2、出现堆栈溢出,往往是因为对函数的递归调用不合理或使用递归算法不合适(应考虑使用其它算法替代)造成的,这属于编程上的逻辑错误,正确的做法应该是修改代码,排除逻辑错误。如果只是简单地忽略它,等同于主动为应用程序留下了一个可供别人攻击的堆栈溢出漏洞。
3、即便暂时无法修复代码,也应该以对话框或其它形式通知程序使用者发生了什么事情,由程序使用者来决定怎样处理,而不是简单地忽略它。
可以将栈想象成一堆从顶向下堆叠的盒子。当每调用一次方法时,我们将应用程序中所要发生的事情记录在栈顶的一个盒子中,而我们每次只能够使用栈顶的那个盒子。当我们栈顶的盒子被使用完之后,或者说方法执行完毕之后,我们将抛开这个盒子然后继续使用栈顶上的新盒子。堆的工作原理比较相似,但大多数时候堆用作保存信息而非保存执行路径,因此堆能够在任意时间被访问。与栈相比堆没有任何访问限制,堆就像床上的旧衣服,我们并没有花时间去整理,那是因为可以随时找到一件我们需要的衣服,而栈就像储物柜里堆叠的鞋盒,我们只能从最顶层的盒子开始取,直到发现那只合适的。
栈是自行维护的,也就是说内存自动维护栈,当栈顶的盒子不再被使用,它将被抛出。相反的,堆需要考虑垃圾回收,垃圾回收用于保持堆的整洁性,没有人愿意看到周围都是赃衣服,那简直太臭了!
当我们的代码执行的时候,栈和堆中主要放置了四种类型的数据:值类型(Value Type),引用类型(Reference Type),指针(Pointer),指令(Instruction)。
这里有一条黄金规则:
1. 引用类型总是放在堆中。(够简单的吧?)
2. 值类型和指针总是放在它们被声明的地方。(这条稍微复杂点,需要知道栈是如何工作的,然后才能断定是在哪儿被声明的。)
栈是负责保存我们的代码执行(或调用)时的路径。当我们的代码开始调用一个方法时,将放置一段编码指令(在方法中)到栈上,紧接着放置方法的参数,然后代码执行到方法中的被“压栈”至栈顶的变量位置。
详细资料必须参考相关书籍。
可以看出,你至少用了23个label,这种用法不科学。建议你建立一个控件数组,23个label分别用label1(1)——label1(23)表示,这样,你的程序可以大大简化:
dim i as integer
i=label1(1).caption
if i>=0 and i<=9 then
label1(i+14).caption=label1(i+14).caption+1
end if
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)