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 回答