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とGCC4.8の両方で同じ動作
それが存在していたが、b
あるNULL
にelse
支店、およびそれに関数を呼び出すと、未定義の動作です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加