在写一个Win32程序时,出现了一个错误,是在写WM_COMMOND里面的消息处理时遇到的,在点击窗口的边框或者最大化最小化时,提示错误:用户回调期间遇到未经处理的异常,然后箭头指向return DefWindowProc (hwnd, msg, wParam, lParam);这个函数。程序在访问内存的时候出现错误,访问了同一个内存地址。于是思考是什么异常,调试。由于这个消息处理的代码有些长,于是就把这个消息处理的代码全部注释了!然后一段一段的取消注释,在一个声明数组的地方发现了问题,声明了一个100000大小的无符号整型数组,按照我以往的经验,我觉得局部开辟这么大的空间应该是可以的,然后改成10000,再次运行错误就消失了。
可以看出,也许是由于前面已经开辟了内存空间,编译器给函数分配的内存是有限的。
我们知道内存空间分配有静态分配和动态分配,静态分配是编译器做的,而动态分配需要使用new或者malloc函数等。局部的栈和堆的空间是有限的。有了教训,声明大的内存空间最好是使用全局变量,这样避免内存空间不足的异常发生。也有人提议,为了代码的可读性以及编写规范,全局变量会使得程序难以阅读和理解。真的有些矛盾啊!看具体的需求吧,如果是嵌入式,或者对应用设计的数据量比较少,就使用局部变量,否则就使用全局变量,但使用的时候要约定好变量的命名规则,范围等等。下面附上一张C++内存的布局: