一次调试c++ bug的记录
2014-02-18 21:09
204 查看
这个bug的现象是从数据库中取出的一个值莫名被修改了,后来经过层层排查,发现公司代码中过度使用强制转换:
为了所谓的面向对象和继承体系,在代码中写了无数次父类子类的强制转换
这样的代码,一不小心就出bug了
我记得effective c++上曾说到这点,(顺effective c++者昌,逆effective c++者亡)
以下是出错代码的简化版,实际代码比这个复杂得多,牵涉到父类/子类对象的引用,取值(operator &),提值(operator *)
为了所谓的面向对象和继承体系,在代码中写了无数次父类子类的强制转换
这样的代码,一不小心就出bug了
我记得effective c++上曾说到这点,(顺effective c++者昌,逆effective c++者亡)
以下是出错代码的简化版,实际代码比这个复杂得多,牵涉到父类/子类对象的引用,取值(operator &),提值(operator *)
struct A { int x; A():x(1){} }; struct B:public A { int y; B():y(2){} }; int _tmain(int argc, _TCHAR* argv[]) { auto_ptr<A> p1(new B()); B * pB = new B; pB->y = 100; auto_ptr<A> p2(pB); // 期望把p2所指的B类对象赋值给p1 // 这行代码的结果是发生对象切割(object slicing) // 只有p2的父类部分被赋值给p1,即使p1和p2都指向子类 *p1 = *p2; // 输出,p1的y并没有被赋值 cout << ((B*)p1.get())->y<<endl; // output is 2, not 100 return 0; }
相关文章推荐
- geotrellis使用(十二)再记录一次惨痛的伪BUG调试经历(数据导入以及读取瓦片)
- 一次C++调试记录
- geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践
- VS调试Bug记录
- 【原】开发路上疑难BUG调试记录
- 记录一次bug解决过程:git深入学习和JDK8新特性
- 记录一次bug解决过程:resultType和手动开启事务
- Eclipse C/C++开发调试环境安装记录
- 一次miniSQL调试记录
- 记录一次bug解决过程:velocity中获取url中的参数
- 记一次调bug记录(15-4-17)
- vs2010 c++ 调试时(exe或dll中有bug)
- 记录一次 linux kernel bug
- 记录一次奇葩的websocket和tomcat7.0.75的bug
- <开发调试>一次bug的启示
- linux c/c++ 段错误bug的调试 详细介绍
- bug调试记录-倾听页面,个人设置页面
- PHP错误日志记录功能,一般用于调试BUG
- Java虚拟机学习笔记-记录一次编译OpenJDK8与调试的过程
- 调试AVIN后视注册消息BUG改正记录保存