由一个BUG想到的
2009-08-08 21:57
253 查看
一个应用程序时不时出现一些莫名其妙的错误。这些错误不是致命的,也就一直推迟,没有修补该bug。
后来,终于发现该bug的规律,就是在加载某个资源的时候,可能产生错误的现象:1、内存访问错误,程序直接崩溃。2、有一个按钮,位置显示错误。由于找到规律,修改bug就容易多了。找到加载资源的代码,终于发现我把一个对象指针,用作了对象数组指针,意思就是:
class A{};
A *pa; pa = new A;
A *pas; pas = new A[3];
由于打字错误,我使用了pa[2] = ...。编译时没问题的,但可想而知,这完全就是内存越界访问错误。
对pa[2]的访问,如果pa[2]指向内存不是本进程空间,则会访问越界,导致程序崩溃,也就产生上面的现象1。如果指向的是本进程空间,则会访问到堆中别的对象,也就导致现象2发生。
这就体现了指针“不好用”之处。一个指针既可以指向一个对象,还可以指向对象数组。
为什么会发生这个错误呢?首先原因就是我打字错误,跟准确的来说,是AssistX提示时,我没看清楚,点击太快所造成的。这也说明有时候用辅助工具不一定就是好事。
还有一个原因就是我的编程习惯的问题。为了解耦,我大量使用指针,比如,class A拥有一个变量B,一般这么声明:
#include "B.h"
class A{
private:
B m_b;
};
这段代码的声明,有较高的耦合度。因为客户程序如果想使用A,也必须把B的头文件包含进来。所以一般的处理方法是:
class B;
class A{
private:
B* m_pb;
};
这段代码具有较低的耦合度,但导致A的实现文件必须动态创建B对象。
我的代码习惯选择了后者,就需要维护好指针。由于我的疏忽,导致了文章开头所说的bug。
上面两种代码编写方式到底哪个好呢?我还是坚持后者,但也不要过于追求解耦。当初我的代码就是过于追求解耦。其实,对于公共的、库函数等公用的类,就没必要这么声明,而直接使用方式一声明就可以了。
后来,终于发现该bug的规律,就是在加载某个资源的时候,可能产生错误的现象:1、内存访问错误,程序直接崩溃。2、有一个按钮,位置显示错误。由于找到规律,修改bug就容易多了。找到加载资源的代码,终于发现我把一个对象指针,用作了对象数组指针,意思就是:
class A{};
A *pa; pa = new A;
A *pas; pas = new A[3];
由于打字错误,我使用了pa[2] = ...。编译时没问题的,但可想而知,这完全就是内存越界访问错误。
对pa[2]的访问,如果pa[2]指向内存不是本进程空间,则会访问越界,导致程序崩溃,也就产生上面的现象1。如果指向的是本进程空间,则会访问到堆中别的对象,也就导致现象2发生。
这就体现了指针“不好用”之处。一个指针既可以指向一个对象,还可以指向对象数组。
为什么会发生这个错误呢?首先原因就是我打字错误,跟准确的来说,是AssistX提示时,我没看清楚,点击太快所造成的。这也说明有时候用辅助工具不一定就是好事。
还有一个原因就是我的编程习惯的问题。为了解耦,我大量使用指针,比如,class A拥有一个变量B,一般这么声明:
#include "B.h"
class A{
private:
B m_b;
};
这段代码的声明,有较高的耦合度。因为客户程序如果想使用A,也必须把B的头文件包含进来。所以一般的处理方法是:
class B;
class A{
private:
B* m_pb;
};
这段代码具有较低的耦合度,但导致A的实现文件必须动态创建B对象。
我的代码习惯选择了后者,就需要维护好指针。由于我的疏忽,导致了文章开头所说的bug。
上面两种代码编写方式到底哪个好呢?我还是坚持后者,但也不要过于追求解耦。当初我的代码就是过于追求解耦。其实,对于公共的、库函数等公用的类,就没必要这么声明,而直接使用方式一声明就可以了。
相关文章推荐
- 渣渣用JavaScript开发的消消乐,由于没有按照正规消消乐形式生成,是随机产生图形,所以存在一个算法bug,具体看下面,高手想到可以告诉我
- 由一个疑难Bug想到的... ...
- 养成好的编码习惯----由一个bug想到的
- (十九)由一个bug想到的:使用jQuery和angularJS需要注意的事
- 由一个bug想到的
- 由一个手机BUG想到的
- 一个浏览器兼容性bug所想到的
- 一个类型转换引起的Bug
- .NET下WebBrowser的一个BUG以及其替代品—geckofx
- 关于axis2中对soapfault的处理的一个小bug
- FireFox的一个bug
- scooterframework分页的一个bug
- 修改了gnokii的一个BUG
- [转载]经典搞笑:一个BUG引发的血案|为程序员打造的年终大片
- jquery关于checkbox在ie下的一个bug
- 捉虫经历:耦合度过高引入的一个bug
- 发现了一个gdb的小bug
- 解决 visualmark.vim 碰到的一个BUG(E197)
- 一个由“有道词典”引起的前端bug