我环顾四周试图找出是否应该在C ++中返回一个二维数组,但得到的答案却很复杂。
有些答案说 no ,因为数据是函数的本地数据,当它返回时,数组指向“垃圾数据”(因为它可以随时被覆盖)。但是,有些人说“是的,就像普通数组一样返回它。”
所以,我的困境:
我有一个2D数组,其中包含指向Tile
个对象的指针
Tile* map[128][128];
我应该在函数中返回数组吗?为什么或者为什么不?如果答案是肯定的,我该怎么做?
编辑:我不清楚。我想制作一个getter方法来返回map变量,并能够在另一个函数中使用数组中的指针。答案 0 :(得分:4)
你可以这样做......问题是你的调用者现在负责释放内存。他可能不知道你是如何分配它的。他应该打电话给free()吗?删除[]?操作系统提供的免费例程?或者你的应用程序中的其他内存缓存系统提供了一个?
围绕这个的两种常见方法是:
然后......谁将释放Tile *实例?用什么API?所以也许你需要一个Tile矢量矢量,而不是Tile *。
vector<vector<Tile>> map;
答案 1 :(得分:3)
你得到的2个答案是由于两种不同的方式。
基于堆栈 - 本地内存,已取消分配且返回的指针无效
typedef int *(*TileGrid)[128];
Tile* map[128][128];
....
TileGrid GetTiles(){
return map;
}
堆分配 - 在堆上分配但在函数结束后未解除分配,直到此函数的调用者才能解除分配 - 安全。
typedef int *(*TileGrid)[128];
TileGrid map = new Tile*[128][128];
....
TileGrid GetTiles(){
return map;
}
推荐 - C ++方式 - 数组而不是向量,因为大小为编译时常量(真正的C ++方式是使用 std::unique_ptr<Tile>
而不是Tile *,但一次只发出1个问题。这些容器会自动为您管理内存,std :: array可以像使用常规数组一样使用。
typedef std::array<std::array<Tile*,128>,128> TileGrid;
TileGrid map ;
...
TileGrid& GetTiles(){
return map;
}
通过引用返回以防止昂贵的副本,并且因为该函数只是一个getter而且该对象保持map
的所有权。
编辑:修复了getter函数
答案 2 :(得分:1)
C / C ++有两种类型的内存 - 堆栈和堆。通常,变量在堆栈上分配,这是临时存储,并且在退出当前作用域时标记为可重复使用 - 例如当您结束循环或从函数返回时。
当你使用new
时,它将分配堆内存,这将一直存在,直到你使用delete
,但你必须小心你匹配所有新的和删除调用,这样你就不会得到内存泄漏。在C ++中管理这种情况有很多策略。你可以谷歌搜索“用C ++进行内存管理”来了解更多信息。
在您的简单情况下,我建议避免指针,但使用stl容器来构建您的tile数组。例如像vector< vector<Tile> > map
这样的std :: vector。您可以使用相同的方括号语法来访问地图,例如map[x][y] = Tile();
这样,数组的内存分配和管理就在vector类中处理。