1

タイルベースのレベルを作成しているコードがあります。

class Level {

//Variables
//===================================================
public:
    Tile *** TileGrid;  //A 2d array of pointers to tiles
    int TilesWide, TilesTall;

//Methods
//===================================================
public:
    Level::Level(char * fileName);
    Level::~Level();
    void Draw();
};

TileGridにメモリを割り当てましたが、すべて問題ありません。クラスにもデストラクタを設定しています。

Level::~Level() {

    for (int i = 0; i < TilesTall; i++) {
        for (int j = 0; j < TilesWide; j++)
            //delete the looped tile being pointed to
            delete TileGrid[i][j];

        //delete the row
        delete [] TileGrid[i];
    }

    //delete the array of rows
    delete [] TileGrid;
}

笑い声のために、私はレベルのインスタンスを削除することにしました。そうしても、Drawメソッドを呼び出すことができることがわかりました。

デバッガーでは、TilesWideとTilesTallの値は非常に負の数であるため、グリッドを反復処理するforループには何も描画されません。

削除された変数にアクセスしようとしても、なんらかのクラッシュは発生しませんか?

4

4 に答える 4

2

必ずしもクラッシュを引き起こすとは限りません。するかもしれないし、しないかもしれない。それはいわゆる未定義動作を引き起こします:


この国際規格が要件を課していない未定義の動作動作

それは宇宙を破壊するのと同じくらい多くの墜落を起こす可能性があります。

于 2013-02-13T20:18:43.987 に答える
2

クラッシュを引き起こす可能性があります。そのメモリが別のオブジェクトで上書きされているか、メモリシステムがそのページを別のプロセスに再割り当てするか(または現在のプロセスからページの割り当てを解除するか)によって異なります。肝心なのは、それが機能することを信頼することはできないということです(すでにご存知のとおり)

于 2013-02-13T20:19:05.767 に答える
1

削除後にオブジェクトにアクセスすることは、未定義の動作です。未定義の動作は、「成功したように見える」から「クラッシュ」、「ハードディスクのフォーマット」まで、あらゆる意味を持ちます。

于 2013-02-13T20:19:12.427 に答える
1

あなたがしたことは「未定義動作」として知られています。

また、未定義の動作は「クラッシュする」という意味ではなく、何かが起こる可能性があることを意味します。プログラムはハードドライブをフォーマットしたり、バッハのソナタを演奏したり、画面にダフィーダックの絵を描いたり、負の値を与えたりする可能性があり、いずれの場合もまさにあなたが求めていたものになります。

クラッシュと同様に、クラッシュしないことが含まれています。

ここで、C++のかなり適切な実装を想定しましょう。メソッドは、渡すLevel::Drawインスタンスによって変化しないLevelため、呼び出す関数はインスタンスに依存しません。インスタンスは、変数のコピーであったヒープ内のメモリを指すポインタとして、パラメータとしてこの関数に渡されます。それ以来、他の目的でリサイクルされているか、ヒープに関する簿記情報が含まれている可能性があります。何が定義されていないのでしょうか。(そして、ランタイムがページをシステムに返した場合、それにアクセスするとセグメンテーション違反になる可能性があります)

次に、そのガベージをいくつかの値として解釈します。intほとんどのシステムでは、ランダムなガベージはほとんど常にC ++ eger(この場合は負の整数)のように見えるため、問題はまったくありません。

さて、ポインタの逆参照を開始すると(つまり、メモリの「ランダムな」部分にアクセスし始めると)、または状態への書き込みを開始するとthis、クラッシュが発生する可能性があります(そうでない場合は、後で、または他の場所で)。

于 2013-02-13T20:22:02.113 に答える