- 论坛徽章:
- 0
|
本帖最后由 SNYH 于 2011-08-30 13:08 编辑
调试了一上午总算把昨天的一个奇怪的bug找到了
源自于 c++的 对象布局的特殊性(bug 当然是我自己的无知,和c++没什么关系)
- class Model {
- public:
- void fun1();
- void fun2();
- .....
- private:
- Type1 m1;
- Type2 m2;
- };
复制代码 这个Model类主要是用来封装算法的,放在另外的一个control类里面
- class Control {
- public :
- ....
- private:
- Model* model;
- };
复制代码 Control是个单例写 getInstance()的时候直接写上了new Control() 但我根本就没写Control的构造函数,编译器就默认给了个我, 悲剧的事情就即将发生了.
运行crash. gdb跟踪跟到Model的fun1, 发现在调用成员m1时候崩溃, 那个成员类型是opencv2的cv::Mat, 因为刚接触这个,所以就注意力一直放在这个Mat上面.
网上查找发现有类似的bug, 只不过别人是在resize的时候崩溃, 其他情况很相似也是用wxWidgets+Opencv 错误地方也是一样.
然后继续gdb找阿找阿. 发现是在Mat::release()的时候出问题, 看opencv2的源码, 里面先检测refcount的值然后处理.
可我refcount指向的并非是合法内存, cv::Mat构造的时候难道不初始化这个指针阿.
以下是重点,上面都是废话
过了会突然想到好像没地方构造过Model, 这个model从头到尾就是个野指针. 但由于Model的成员函数大部分都没有使用数据成员或者是设置数据成员而没访问数据成员.
所以开始一切OK, 直到Model里面的某个函数调用某个成员的方法时内存越界 程序崩溃.
c++ class的成员函数不需要类构造就可以使用, this只是在访问数据成员的时候才起作用.
指针好危险......... |
|