在if-cases泄漏中定义的变量? (又名为什么这甚至编译?)

时间:2013-11-26 09:21:36

标签: c++

似乎在if语句中声明的变量泄漏到以下语句?

我复制粘贴了一些代码,令我惊讶的是它编译时,它应该没有! 我准备提交代码并且在此之前我抓住了错误。下面是一个显示问题的工作(?)程序。

以下代码段调用不存在的对象上的函数:

#include <iostream>

class A {
public:
  virtual ~A() {}
};

class B : public A {
public:
  void fooB() { std::cout << "fooB\n"; }
};

class C : public A {
public:
  void fooC() { std::cout << "fooC\n"; }
};

int main() {

   A* a = new C();

   if (B* b = dynamic_cast<B*>(a)) {
      b->fooB();
   } else if (C* c = dynamic_cast<C*>(a)) {
      c->fooC();
      b->fooB();
   }

   return 0;
}

它编译并输出如下:

fooC
fooB

这肯定是错的。我是否需要启用一些警告以防止编译此代码?

如果我试图访问某些成员变量或调用虚函数,想象一下恐怖!

VS2008和GCC 4.8

中的行为相同

1 个答案:

答案 0 :(得分:6)

它确实存在,但bNULL分支上是else,并且在其上调用函数是未定义的行为。