0

基本クラスポインタの配列を実行するこの単純なループがあります。

Object * objects[2];

objects[0] = new GreenObject;
objects[1] = new RedObject;
objects[2] = new BlueObject;


for (int i = 0; i < 3; ++i) {
    cout << i << " ";
    objects[i]->info();
}

iデバッグモードでは、info()メソッドが呼び出されると、出力直後のループの3回目の反復でプログラムがクラッシュします。リリースモードではそのようなことは起こらず、正常に実行されています。他の派生クラスを使用してもロックされるため、オブジェクトの問題ではありません。

Windows764ビットでのGCC4.4.0

何か案は?

4

2 に答える 2

8

これは(そしてforループして)配列の終わりを超えています:

objects[2] = new BlueObject;

未定義の動作を引き起こします。それがリリースで実行されるという事実は、(不)幸運です。未定義動作のサブセットは、期待どおりに動作することです。

配列インデックスはから0まで実行されますN - 1。ここNで、は配列内の要素の数です。objects有効なインデックスの場合は01のみです。の宣言を次のように変更objectsします。

Object * objects[3];
于 2012-08-10T12:51:24.693 に答える
6

アクセスobjects[2]は未定義の動作です。

プログラミングエラーが常にクラッシュや明らかな失敗につながると予想するのはよくある間違いです。

未定義の動作とは、状況によっては機能しているように見えることを含め、何かが発生する可能性があることを意味します。

予測可能で反復可能な動作が必要な場合は、正しいコードを作成する必要があります。

于 2012-08-10T13:02:43.590 に答える