堆栈
堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(lifo)队列。 堆栈中定义了一些操作。 两个最重要的是push和pop。 push操作在堆栈的顶部加入一 个元素。pop操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。
堆栈溢出
堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆栈溢出很可能由无限递归(infinite recursion)产生,但也可能仅仅是过多的堆栈层级。
堆栈溢出就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了别的数据。 可以理解为 在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址,这样当过程返回时,程序就转而开始执行这段自编的代码了。
比如如下这段程序:
#include《stdio.h》
int main()
{
char name[8];
printf(“please type your name:”);
gets(name);
printf(“hello.%s!”,name);
return 0;
}
编译并且执行,输入ipxodiaaaaaaaaaaaaaaaa,执行完gets(name)之后,堆栈如下:
内存底部 内存顶部
name ebp ret
《-------[ipxodiaa][aaaa][aaaa]。。。。。。。。。。。。
^&name
堆栈顶部 堆栈底部
由于我们输入的name字符串太长,name数组容纳不下,只好向内存顶部继续写‘a’,如果提前申请动态内存就可以避免堆栈溢出。而此例由于堆栈的生长方向与内存的生长方向相反,这些‘a’覆盖了堆栈的老的元素。’ebp ret’都被‘a’覆盖了。在main返回的时候,就会把‘aaaa’的ascii码:0x41414141作为返回地址,cpu会试图执行0x41414141处的指令,结果出现错误。这就是一次堆栈溢出!
vs 堆栈溢出的解决方案
方法一 : 不静态分配,用new动态创建,从堆中分配的,堆的空间足够大。
不过记得写析构函数,delete你申请的堆空间。其实这样也挺方便,类结束的时候会自动调用析构函数释放空间。养成“不在栈上定义大数组/大对象”的好习惯很重要,否则再大的栈也会被撑爆的。
当然,如果你不喜欢new,delete的话,还是静态分配(毕竟静态分配有很多好处),那么可以通过改变默认栈空间来解决。
方法二 :stacksize 定义.def文件
语法:stacksize reserve[,commit]
reserve:栈的大小;commit:可选项,与操作系统有关,在nt上只一次分配物理内存的大小
方法三 :设定visual stdio 的/stack 大小
1 vc6.0修改:
打开工程,依次操作菜单如下:project-》setting-》link,在category 中选中output,然后在reserve中设定堆栈的最大值和commit。
注意:reserve默认值为1mb,最小值为4byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
2 vs2008修改
在 visual studio 开发环境中设置此链接器linker选项
· 右键打开项目的“属性页”对话框。有关详细信息,请参见设置 visual c++ 项目属性。
· 单击“链接器linker”文件夹。
· 单击“系统 system”属性页。
· 修改下列任意一个(都该也可以)属性:
· 堆栈提交大小stack reserve size 100000000;
· 堆栈保留大小stack commit size 100000000.
在平常的上网当中是否遇到过电脑弹出网页消息提示“堆栈溢出”,那么现在小编就简单描述下解决这个问题的办法。
打开自己常用的浏览器,这个方法适用于所有的浏览器。所以不用担心会出现其他的状况。
找到菜单栏,在菜单栏上面存在一个“工具”选项,单击工具这个按钮。
在“工具”这个选项下面有个“internet选项”,点击这个功能选项。就可以进入“internet选项”界面。
主要的操作就在“internet选项”里面,当你点击“internet选项”的时候就会弹出一个窗口。
在“internet选项”窗口上方有个“高级”按钮,点击这个按钮,然后在“设置”下一级存在一个功能“禁用脚本调试”,这个功能项在默认状态下是勾选起的,现在我们要取消勾选这个功能项。
完成了这最后一步就解决了堆栈溢出的问题,现在就可以马上试试,是不是不会出现了呢?
中国伺服系统产业发展预测
联盟工业数据中心特设组在无锡召开会议
龙芯云体系建设整体概述及各解决方案
时序签核方法学及实战经验
华为5g手机壳亮相,华为手机5g有哪几款
堆栈溢出怎么解决方式
苹果Mac芯片 跨入一个性能飞跃的新纪元
数字双胞胎象征CPS虚实融合技术 数字双胞胎加VR 挥洒弹性制造效益
虚拟经纱张力的测试仪技术
小米6什么时候上市?小米6最新消息:小米6指纹识别媲美华为
如何对电动汽车动力电池散热方法在这!
什么是特锐祥贴片Y电容?一起来了解下!
直流变交流逆变器的工作原理及电路分享
DSP系统构成的常用芯片有哪些?
黄云辉/李巨/伽龙AM:新型两亲性锌盐实现高性能水系锌金属电池
耦合电容1uf换10UF会怎么样
详谈电脑主机上的VGA接口和DVI接口的区别
PCB设计添加工艺边与MARK点的方法
新能源汽车扁线电机技术分析
工业3D打印:一场仍处在初级阶段的技术革命