C ++ - 通过函数返回2D数组

时间:2012-12-11 01:57:19

标签: c++ c arrays pointers

我环顾四周试图找出是否应该在C ++中返回一个二维数组,但得到的答案却很复杂。

有些答案说 no ,因为数据是函数的本地数据,当它返回时,数组指向“垃圾数据”(因为它可以随时被覆盖)。但是,有些人说“是的,就像普通数组一样返回它。”

所以,我的困境:

我有一个2D数组,其中包含指向Tile个对象的指针

Tile* map[128][128];

我应该在函数中返回数组吗?为什么或者为什么不?如果答案是肯定的,我该怎么做?

编辑:我不清楚。我想制作一个getter方法来返回map变量,并能够在另一个函数中使用数组中的指针。

3 个答案:

答案 0 :(得分:4)

你可以这样做......问题是你的调用者现在负责释放内存。他可能不知道你是如何分配它的。他应该打电话给free()吗?删除[]?操作系统提供的免费例程?或者你的应用程序中的其他内存缓存系统提供了一个?

围绕这个的两种常见方法是:

  • 让呼叫者分配内存,而您的功能只是填充它
  • 使用C ++数组类;在这里你可能有一个std :: vector包含一个Tile *的std :: vector。这很好,因为它无法手动处理内存分配/释放。

然后......谁将释放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类中处理。