1

2d生物クラス ポインターの配列を作成します。

try{
    world = new Organism**[worldSizeX];

    for (int x = 0; x < worldSizeX; x++){
        world[x] = new Organism*[worldSizeY];

        // INITATES world ARRAY
        for (int y = 0; y < worldSizeY; y++){
            world[x][y] = new Organism;
        }
        // !INITATES world ARRAY
    }
}
catch (std::bad_alloc){
    std::cout << "Not enough memory for World size" << worldSizeX << "x" << worldSizeY << std::endl;
    deleteWorld(); // DO I NEED THIS?
    init((int)worldSizeX/2, (int)worldSizeY/2, ants, beetles);
    return;
}

私が持っている場合はbad_alloc、より小さな int 値で init を呼び出したいと思います。アレイをdelete失敗させる必要がありますか、それとも単に実行できますか? はいの場合、それを削除するにはどうすればよいですか。アレイアプリケーション全体をループすることはできません。クラッシュするだけです。

4

2 に答える 2

3

しようとするとプログラムがクラッシュする理由deleteWorldは、配列が完全に初期化されていないためです。したがって、このプロセス中に初期化されていないポインターが発生する可能性があります。

これを回避するには、配列をゼロで初期化します。

world = new Organism**[worldSizeX]();

()(配列のゼロ初期化を意味する末尾の に注意してください)。

を実装する場合deleteWorld、NULL のエントリをスキップする必要があります。

最後に:はい、取得したらすべてを削除する必要がありますbad_alloc。一部のオブジェクトは既に割り当てられている可能性があるため、最初に割り当てを解除せずに割り当てた場合、メモリリークが発生します。

于 2014-12-21T11:10:53.417 に答える
2

vector を使用すると、デストラクタが自動的に呼び出されるため、必要がなくなり、プログラムがリークすることはありません

try{
    vector< vector < Organism > >world;
    world.resize(worldSizeX);

    for (int x = 0; x < worldSizeX; x++){
        world[x] = vector<Organism>(worldSizeY);//this calls the default constructor so you don't need the second for loop
    }
}
catch (std::bad_alloc){
    std::cout << "Not enough memory for World size" << worldSizeX << "x" << worldSizeY << std::endl;
    init((int)worldSizeX/2, (int)worldSizeY/2, ants, beetles);
    return;
}
于 2014-12-21T11:04:19.493 に答える