gpt4 book ai didi

c++ - 二维 vector/动态数组

转载 作者:太空宇宙 更新时间:2023-11-04 14:17:07 24 4
gpt4 key购买 nike

我正在尝试使用二维数组来跟踪以网格方式布置的一些对象。我希望二维数组的每个元素都包含一个 Object* . Object作为我定义的类(class)。然而,使用这些东西并不容易。

这是我用 Object 填充二维数组的方法指针:

int xDim; 
//how far to go in the x direction
//x's Dimension that is

Object *** test; //the highest level pointer used

test = new Object ** [xDim];
//add horizontal array of Object **

for(int fillPos=0; fillPos < xDim; fillPos++){
//point each Object ** to a new Object * array
//add column arrays
test[fillPos] = new Object*[zDim];
}

然后我打算使用这个数组的 Object指向 Object 子类的指针,说 childObj .我的意图是以这种方式使用它们。

for (int xPos=0; xPos < xDim; xPos++){
for(int zPos=0; zPos < zDim; zPos++){
//pointing each Object * in the 2D array to
//a new childObj
test[xPos] [zPos] = new childObj;
}
}

我意识到这在内存方面可能是一个真正的麻烦。我在问这是否是处理这种情况的好方法。也许像 vector< <vector<Object*> >工作更好? vector 会很好地管理删除以避免内存泄漏吗?或者我可能只需要遍历 vector 并调用 delete在每个 Object*在摆脱 vector 本身之前?

那么,我应该像现有的那样使用数组还是 vector ?每种方法可能存在哪些问题?

最佳答案

使用 Object *** 需要遍历并删除每个 Object Pointer、每个 Array of Object Pointers,最后按顺序删除最外层的Array of Object**。在我看来,这为粗心大意和错误留下了很大的空间。

for (int xPos=0; xPos < xDim; xPos++) {
for (int zPos=0; zPos < zDim; zPos++) {
delete test[xPos][yPos]; // delete the object ptr
}
delete[] test[xPos]; // delete each array of object ptr
}
delete[] test; // delete the array of array of object ptrs

我更喜欢 vector 方法,因为 vector 是局部范围的。动态分配可能相当昂贵,应尽可能避免。

因此对于 vector 方法,您只需要删除对象指针。 (一个好的经验法则是每次调用 new 都需要相应的 delete 调用)。

vector<vector<Object*>> matrix;

... // some code here

for each (vector<Object*> vec in matrix)
for each (Object* oPtr in vec)
delete oPtr;

如果您在编译时知道二维数组的大小,就可以达到避免二维数组内存管理的相同效果,而只需管理对象指针即可。

Object * matrix[xDim][yDim];  // xDim and yDim are compile-time constants

但我仍然喜欢 vector ,因为与数组不同,它们具有能够动态调整自身大小的额外好处,因此您不必担心预先知道大小。

关于c++ - 二维 vector/动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10288504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com