Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针或堆对象的二维数组_C++_Arrays_Memory Management - Fatal编程技术网

C++ 指针或堆对象的二维数组

C++ 指针或堆对象的二维数组,c++,arrays,memory-management,C++,Arrays,Memory Management,我有一个游戏有一个网格,它是一个2D数组。此数组填充了一个信息结构 struct GridCell { uint mCellID; Vector2 mPosition; uint mLevel; int mCellType; }; class Grid { public: Grid(); ~Grid() protected: // Heap GridCell[][] mGridCells; // Dynamic

我有一个游戏有一个网格,它是一个2D数组。此数组填充了一个信息结构

struct GridCell
{
    uint mCellID;
    Vector2 mPosition;
    uint mLevel;
    int mCellType;
};

class Grid
{
public:
    Grid();
    ~Grid()

protected:
    // Heap
    GridCell[][] mGridCells;

    // Dynamic
    GridCell*[][] mGridCells;
};
请记住,内存中一次可以有许多网格,这些网格单元的范围可以从非常小到非常大: 这更适合作为GridCell堆还是动态(指针)GridCell堆

据我所知: 堆单元将占用大量内存 动态单元仍然会,但它将是指针,而不是整个结构。但是,这会导致内存碎片吗


我不确定哪一个最适合这种情况,我可能也不完全理解两者之间的区别。帮忙

最好两者都不使用,而使用std::vector。将2d数组设为1d,并将值直接存储到向量中。或者,如果你真的必须有2个维度,你可以创建向量向量。C++中的< < P > >类型有固定的大小。您的
GridCell
s的范围从非常小到非常大,这是不正确的。他们将是一个或另一个
sizeof(GridCell)
是固定的。它们可能各自指向不同大小的对象,但这些对象不是
GridCell
大小的一部分

无论哪种方式,您提出的两种方法在内存中的
GridCell
s的数量都是完全相同的,因此使用指针不会保存任何内容。事实上,动态分配的方法将使用更多的内存,因为您还存储指向每个单元格的指针。指针方法提高内存效率的唯一方法是使用单个
GridCell
对象来表示
网格中的多个单元格。也就是说,一些指针是相同的

这实际上归结为哪一个更易于管理,答案总是“没有指针的方法”。这意味着您的
Grid
对象将自动管理
GridCell
的构造和销毁,而无需您关心它,从而帮助您避免内存泄漏。如果使用指针方法,则必须在
Grid
的构造函数中循环数组,对每个元素执行
new GridCell()
。您还需要在析构函数中执行相同的操作,对动态分配的每个单元格执行
delete
。这是一种痛苦,尤其是在没有必要的时候

在需要指针的情况下,智能指针更可取


此外,对于固定大小的阵列,使用
std::array
可能会更好。它为您封装了数组,使您可以像使用标准库中的任何其他容器一样使用它。

这里可能不关心这个问题,但需要注意的是,如果向量向量足够大,并且需要相对频繁地迭代,那么向量向量向量可能会导致糟糕的性能。数据的局部性可能很可怕。一个更好的选择是使用一个较大的向量,并手动计算到子“数组”的偏移量。