哪个更好:一个unique_ptr到一个2D阵列,还是一个unique _ptr的2D阵列
Which would be better: A unique_ptr to a 2D array or a 2D array of unique_ptrs?
我目前正在制作一个旧的内存安全项目。
在这个项目中,我有一个2D数组,其中填充了指向我自己的类Block
实例的指针。
这样声明:
Block* gemGrid[xMax][yMax];
然后像这样填充:
for(int i = 0; i<8; i++)
{
for(int j = 0; j<8; j++)
{
//do stuff here
gemGrid[i][j] = new Block(i,j, gridOffset);
}
}
这很好用。
我有了创建unique_ptr<Block>
的2D阵列而不是Block*
的想法。
我决定这样声明:
unique_ptr<Block> gemGrid[xMax][yMax];
并像这样填充:
for(int i = 0; i<8; i++)
{
for(int j = 0; j<8; j++)
{
gemGrid[i][j].reset( new Block(i,j, gridOffset));
}
}
然而,当我尝试这样做时,编译器决定完全忽略第二个for循环("j"递增的部分),只创建一个一维数组。
这让我想问,C++
在2D阵列中与unique_ptrs
有问题吗?我应该只使用指向Block
s的指针的2D数组,并使用一个unique_ptr
来确保这个数组在超出范围时被杀死吗?
C++对unique_ptr
的二维数组没有任何异议。
你提供的两个替代方案对我来说似乎不是真正的替代方案。如果你有一个unique_ptr
到Block*
的二维数组,并且你使用new
分配Block
的xMax * yMax
实例,并将指向它们的指针存储在数组中,那么谁或什么将释放Block
的这些实例?unique_ptr
当然不是。因此,"我应该这么做吗"的答案几乎肯定是"不",因为你会有内存泄漏。
分配Block
实例的二维布局的最"明显"的方法是定义Block
的二维数组(使用内置数组或std::array
(如果可用))。如果你能识别出任何不适合你的东西,那么有人可以为你的旧代码提出一种替代方法,以避免内存泄漏。
[回应上面的评论]完成Block gemGrid[xMax][yMax];
后,如果需要的话,可以获得一个指向Block对象的指针,如下所示:&gemGrid[i][j]
。需要一个指针与内存分配完全无关。指针是new
允许您访问其分配的对象的方法,但无论如何分配,您都可以将指针指向对象。
- 一个 2D 数组,并按行存储值.第一个循环用于行索引,第二个循环用于列索引
- 填充另一个 2D 数组后,堆已损坏
- 如何编写一个简单的CGAL代码来隔离一个2D矩形
- C++将 2D 阵列的一部分复制到另一个 2D 阵列,性能
- 从给定的行和列中生成一个2D整数数组
- 尝试创建一个2D数组,其大小仅在C 中的运行时才知道
- 在C#和C++之间发送一个2D int数组
- C 设置构造器中的数组大小,复制一个2D数组
- 从QTScript操纵一个2D阵列
- Qt:如何制作一个2d插值颜色的字段
- 通过一个函数传递一个2D数组,我得到一个错误
- 无法从 2D 数组执行从 2D 数组到另一个 2D 数组的 strcpy
- 使用 STRCPY 将 2d 字符数组复制到另一个 2d 数组中
- 如何在c++中返回一个2d数组的指针
- 我想找到一个2d数组C++中每一行的最大值
- 将一个2d动态数组传递给C++中的一个函数
- 将一个2d数组指针传递给一个函数,并在函数内部分配内存
- 将多维数组随机化(随机播放)为另一个 2D 数组
- 想要移动一个2d对象而不是另一个
- 将一个2D数组分配给另一个