内存访问冲突问题(非法内存访问)

无独有偶,我居然又碰上了同样的问题。

 

原因跟之前一样,对象在内存中已经被销毁,或者这个对象压根就没有被创建过。

慢慢的查找p_Screen在哪里被复制以及在哪里被销毁,最有效的方法就是看函数调用栈。

当我把断点设置在p_Screen赋值语句的那一行时,发现还没运行到断点处就已经触发异常了,当然还有一种可能就是断点处的函数根本就没有被调用,而是跳过了这个函数而继续往后面执行了,不过我反复测试了一下,基本可以排除第二种可能。

因此问题的症结就在指针在还没有被初始化或者赋值之前就被访问了(看到这个错误读者是否很无语?那就继续往下看吧    )

解决方法:

将指针的初始化提前到在访问之前就行。  

总结:这个问题确实是很简单,但是我为什么会犯这种错误呢?

我觉得。。。这不怪我,不怪我,真的不怪我!!!

责任在于框架程序的响应方式(~。-) :

因为我的项目用的是MFC的框架编程,所以框架内部的各个模块调用先后顺序真的并不是很明确,而且不是显示(与隐式相对)的通过一个成员函数调用另一个成员函数,各个函数之间没有明确的调用与被调用关系。

他们之间是基于消息机制驱动的。

系统(内核)发送消息(这些消息大部分是我的项目为了创建窗口或者申请资源的需要而自动要求内核发送的,只有一小部分是内核捕捉到的消息,比如鼠标点击、键盘按下等等),指定函数对其进行响应,因此函数之间的调用关系以及执行的先后顺序自然是捉摸不定的。

像这种基于系统消息驱动的程序,在编程时一定要小心了,在消息函数的调用顺序不明确的时候,尽量不要把自己的赋值语句写进去,除非万不得已,为了实现功能的需要。

否则就有可能出现你的变量还没有被初始化之前就已经被访问,那么就会出现程序运行时错误了。(慎用框架)

当然框架也有很多优点,对于我们这种刚刚写项目的newbie,对设计模式也不太了解,框架可以帮我们构造好项目的一个基本模型,我们只需要了解整个框架的结构,向里面添加一些功能就好,这样整个项目也就条理清晰,可读性也强,也易于维护。

 

posted @ 2018-11-28 18:03  从零开始的大学生活  阅读(3043)  评论(0编辑  收藏  举报