开发时遇到的bug,写出来做备忘。
先看下面这段代码有什么bug?
A *a = getA(…);
if( a != NULL ){
B *b = dynamic_cast<B *>(a);
if( b != NULL ){
b->setColor(…);
}
}
关于dynamic_cast:
对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。因此可以用来在运行期间进行类型判断。
可知:
1.dynamic_cast会抛出异常
2.dynamic_cast在转型失败时返回NULL
上面的代码的bug在这一句,
B *b = dynamic_cast<B *>(a);
b 没有被初始化。
当 dynamic_cast抛出异常时,并没有对 b 初始化,此时b不为NULL。用 if( b != NULL )无法判断dynamic_cast是否成功。
结论:
应明确将b初始化为NULL:
A *a = getA(x, y);
if( a != NULL ){
B *b = NULL;
b = dynamic_cast<B *>(a);
if( b != NULL ){
b->setColor(…);
}
}