如果我得到std :: bad_alloc该怎么办?

时间:2014-12-21 11:01:57

标签: c++ pointers memory bad-alloc

创建有机体类指针的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失败的阵列或者我可以将其运行?如果是,那么我如何删除它,我无法循环遍历整个数组应用程序只是崩溃。

2 个答案:

答案 0 :(得分:3)

尝试deleteWorld时程序崩溃的原因是您的阵列未完全初始化。因此,在此过程中您可能会遇到未初始化的指针。

为避免这种情况,零初始化您的数组:

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

(注意尾随(),表示数组的零初始化。)

现在,当您实现deleteWorld时,您将不得不跳过任何NULL条目。

最后:是的,当你得到bad_alloc时,你必须删除所有内容:某些对象可能已经被分配,因此如果你在没有首先解除分配的情况下进行分配,那么你将会有内存泄漏。

答案 1 :(得分: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;
}