堆上对象和子对象的固定大小数组

Fixed-size array of objects and sub-objects on the heap

本文关键字:对象 小数 数组      更新时间:2023-10-16

我搜索了又搜索,但没有找到任何能真正消除我困惑的东西。

我代表一个网格,有两个类,例如:

class Term {
   ...
};
class GridPoint{
   Term a;
   Term b;
   Term c;
   ...
};

我想在堆上有一个固定大小的大数组,其中数组的每个元素都是一个GridPoint,它本身包含多个Terms。

但是,以下示例不会编译:

GridPoint* pGrid = new GridPoint[100][100];

根据gcc:

错误:无法在初始化中将"GridPoint(*)[100]"转换为"GridPoint*"

首先,我建议不要在现代C++中使用newdelete,而是使用智能指针或封装为std::vector的标准库中的容器。

也就是说,为了让你的例子发挥作用,你必须在一个循环中初始化一个数组,如下所示:

GridPoint** pGrid = new GridPoint*[100];
for (std::size_t i = 0; i != 100; ++i) {
    pGrid[i] = new GridPoint[100];
}
// Do something...
for (std::size_t i = 0; i != 100; ++i) {
    delete[] pGrid[i];
}
delete[] pGrid;

要获得更好的替代方案,只需使用std::arraystd::vector:

std::array<std::array<GridPoint, 100>, 100> pGrid;

注意:std::array封装了一个用于存储数据的静态数组。这意味着,如果分配具有自动存储持续时间的std::array对象,则不会动态分配其数据(数据不会在"堆"上)。

CCD_ 8将使用动态分配来存储其数据。