C++ 局部变量 栈溢出——在子函数中大量申请空间所致

一、单幅图像过大,visual studio 2019 内存bug

1. 现象

hist申请的2张图像空间,在step into process函数时,原来申请的图像内存被覆盖了。内存内容丢失

临时解决办法: 将hist等需要大内存的空间,放在全局main中,或者main函数体之外,变为全局变量。

参考教程:修改visual studio的默认堆栈大小

  • 函数的参数、局部变量;编译器自动分配释放。放在栈区,stack。

    • stack栈的空间是预先分配的,每次不一样。

    • windows下,栈的大小为2M。

    • 局部变量中的大内存分配,本来就应当是外面分配好,然后逐步传入的。不能再子函数内部新申请局部变量,否则函数执行完后,局部变量会被释放。

  • heap堆区,程序员分配。堆区是不连续的,是链表来存储的空闲内存地址。堆的大小受限于有效虚拟内存

    • 虚拟内存:将不用的内存、电脑硬盘,变成虚拟内存来使用。

C/C++编译的程序占用的内存分为几个部分:

1、栈区(stack segment)由编译器自动分配释放,存放函数的参数的值,局部变量的值等。在Windows下,是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的是1M),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

2、堆区(heap segment) : 一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收 。它与数据结构中的堆是两回事。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

3、全局区(静态区)(data segment):全局变量和静态变量的存储区域是在一起的,程序结束后由系统释放。数据区的大小由系统限定,一般很大。

4、文字常量区:常量字符串就是放在这里的, 程序结束后由系统释放。

5、程序代码区:存放函数体的二进制代码。

// 设置默认堆栈的大小,单位是字节,byte,设置为1G

 

写为全局变量!!!(临时解决办法) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值