if-casesで定義された変数がリークしますか?(別名、なぜこれがコンパイルされるのですか?)

マッケ

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あるNULLelse支店、およびそれに関数を呼び出すと、未定義の動作です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

なぜこれがコンパイルされるのですか? 別の関数で宣言された関数

分類Dev

OCaml:変数が定義されていないのになぜこれがコンパイルされるのですか?

分類Dev

別のファイルのC ++クラスがコンパイルされていません。Class.objですでに定義されている1つ以上の複数定義されたシンボルが見つかりました

分類Dev

サイズとして変数が与えられた文字配列を持つこのコードがコンパイルされるのはなぜですか?

分類Dev

使用後に別のトレイトで定義された暗黙がコンパイルエラーになるのはなぜですか?

分類Dev

c#forループ構文クエリ-なぜこれがコンパイルされるのですか?

分類Dev

(実際の関数定義と比較して)パラメーターのない関数がコンパイルされるのはなぜですか?

分類Dev

インポートされた関数によって定義されたグローバル変数が変更されないのはなぜですか?

分類Dev

ローカルで定義された変数が別の関数内から正常にアクセスできるのはなぜですか?

分類Dev

コールバックで定義された変数がコードの他の場所からアクセスできるのはなぜですか?

分類Dev

これらのAzureDevOpsの事前定義された変数がパイプラインビルドで機能しないのはなぜですか?

分類Dev

なぜ「エラーがクラスパスリソースで定義された名前 『のEntityManagerFactory』を持つBeanを作成する」data.sqlにファイルを介してインポート中にこのエラーが発生しません

分類Dev

リストの初期化をコピーしますか?なぜこれがコンパイルされるのですか?

分類Dev

変換コンストラクターと変換演算子が定義されている場合、どちらが優先され、コンパイラーがこの変換を異なるのはなぜですか?

分類Dev

セクションが無限ループにコンパイルされた場合、なぜこれが発生するのでしょうか。

分類Dev

なぜこれがコンパイルされるのですか?

分類Dev

なぜこれがコンパイルされるのですか:string = int

分類Dev

なぜこれがコンパイルされるのですか?[C ++]

分類Dev

これらの「エクスポートされた」変数が二重に定義されているのはなぜですか?

分類Dev

クラス宣言で、コンストラクターのパラメーターがプライベート部分で定義された変数と同じ名前を持てないのはなぜですか?

分類Dev

データ型に演算子<が定義されていないのに、std :: mapコードがコンパイルされるのはなぜですか?

分類Dev

クラス定義で定義されたメンバー関数は、C ++の他の場所で定義されたメンバー関数とは異なる方法でコンパイルされていますか?

分類Dev

コンパイルがエラーで失敗するのはなぜですか: 非スカラー型への変換が要求されました

分類Dev

エクスポートされた変数に対してconsole.logが未定義で出力されることがあるのはなぜですか?

分類Dev

なぜこれがJavaでコンパイルされないのですか?

分類Dev

変数で定義されたグローバルが未定義なのはなぜですか?

分類Dev

ARMアセンブリベクトルテーブルの定義-なぜベクトルがこのように定義されたのですか?

分類Dev

なぜこの列挙型がコンパイルされるのですか?

分類Dev

ミステリーを入力します。このコードがコンパイルされるのはなぜですか?

Related 関連記事

  1. 1

    なぜこれがコンパイルされるのですか? 別の関数で宣言された関数

  2. 2

    OCaml:変数が定義されていないのになぜこれがコンパイルされるのですか?

  3. 3

    別のファイルのC ++クラスがコンパイルされていません。Class.objですでに定義されている1つ以上の複数定義されたシンボルが見つかりました

  4. 4

    サイズとして変数が与えられた文字配列を持つこのコードがコンパイルされるのはなぜですか?

  5. 5

    使用後に別のトレイトで定義された暗黙がコンパイルエラーになるのはなぜですか?

  6. 6

    c#forループ構文クエリ-なぜこれがコンパイルされるのですか?

  7. 7

    (実際の関数定義と比較して)パラメーターのない関数がコンパイルされるのはなぜですか?

  8. 8

    インポートされた関数によって定義されたグローバル変数が変更されないのはなぜですか?

  9. 9

    ローカルで定義された変数が別の関数内から正常にアクセスできるのはなぜですか?

  10. 10

    コールバックで定義された変数がコードの他の場所からアクセスできるのはなぜですか?

  11. 11

    これらのAzureDevOpsの事前定義された変数がパイプラインビルドで機能しないのはなぜですか?

  12. 12

    なぜ「エラーがクラスパスリソースで定義された名前 『のEntityManagerFactory』を持つBeanを作成する」data.sqlにファイルを介してインポート中にこのエラーが発生しません

  13. 13

    リストの初期化をコピーしますか?なぜこれがコンパイルされるのですか?

  14. 14

    変換コンストラクターと変換演算子が定義されている場合、どちらが優先され、コンパイラーがこの変換を異なるのはなぜですか?

  15. 15

    セクションが無限ループにコンパイルされた場合、なぜこれが発生するのでしょうか。

  16. 16

    なぜこれがコンパイルされるのですか?

  17. 17

    なぜこれがコンパイルされるのですか:string = int

  18. 18

    なぜこれがコンパイルされるのですか?[C ++]

  19. 19

    これらの「エクスポートされた」変数が二重に定義されているのはなぜですか?

  20. 20

    クラス宣言で、コンストラクターのパラメーターがプライベート部分で定義された変数と同じ名前を持てないのはなぜですか?

  21. 21

    データ型に演算子<が定義されていないのに、std :: mapコードがコンパイルされるのはなぜですか?

  22. 22

    クラス定義で定義されたメンバー関数は、C ++の他の場所で定義されたメンバー関数とは異なる方法でコンパイルされていますか?

  23. 23

    コンパイルがエラーで失敗するのはなぜですか: 非スカラー型への変換が要求されました

  24. 24

    エクスポートされた変数に対してconsole.logが未定義で出力されることがあるのはなぜですか?

  25. 25

    なぜこれがJavaでコンパイルされないのですか?

  26. 26

    変数で定義されたグローバルが未定義なのはなぜですか?

  27. 27

    ARMアセンブリベクトルテーブルの定義-なぜベクトルがこのように定義されたのですか?

  28. 28

    なぜこの列挙型がコンパイルされるのですか?

  29. 29

    ミステリーを入力します。このコードがコンパイルされるのはなぜですか?

ホットタグ

アーカイブ