一、单幅图像过大,visual studio 2019 内存bug
1. 现象
hist申请的2张图像空间,在step into process函数时,原来申请的图像内存被覆盖了。内存内容丢失
临时解决办法: 将hist等需要大内存的空间,放在全局main中,或者main函数体之外,变为全局变量。
-
函数的参数、局部变量;编译器自动分配释放。放在栈区,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
写为全局变量!!!(临时解决办法)