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

C++ 堆上对象和子对象的固定大小数组,c++,arrays,heap,C++,Arrays,Heap,我找了又找,但没有找到任何能真正消除我困惑的东西 我代表一个网格,有两个类,例如: class Term { ... }; class GridPoint{ Term a; Term b; Term c; ... }; 我希望在堆上有一个固定大小的大型数组,其中数组的每个元素都是一个网格点,本身包含多个项 但是,以下示例不会编译: GridPoint* pGrid = new GridPoint[100][100]; 根据gcc: 错误:无法在初始化时将“Gr

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

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

class Term {
   ...
};

class GridPoint{
   Term a;
   Term b;
   Term c;
   ...
};
我希望在堆上有一个固定大小的大型数组,其中数组的每个元素都是一个网格点,本身包含多个项

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

GridPoint* pGrid = new GridPoint[100][100];
根据gcc:

错误:无法在初始化时将“GridPoint*[100]”转换为“GridPoint*”


首先,我建议不要在现代C++中使用新的和删除,而是使用智能指针或来自标准库的容器,这些容器将其封装为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::array或std::vector:

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


然而,std::vector将使用动态分配存储其数据。

std::数组不在heap@MattMcNabb是的,你说得对,我举了一个std::array用法的例子,因为它显示了它与使用原始内存分配语法相比的简单性。-1用于先显示new[]和delete[],为答案添加了一些正确性。auto*pGrid=新网格点[100][100];
std::array<std::array<GridPoint, 100>, 100> pGrid;