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