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

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

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

所以,我的困境:

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

Tile* map[128][128];

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

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

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

两种常见的方法是:

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

但那么……谁将释放Tile *实例? 用什么API? 所以也许你需要一个Tile矢量矢量,而不是Tile *。

 vector> map; 

你得到的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 *,但一次只发出1个问题。这些容器会自动为你管理内存和std :: array可以像使用常规数组一样使用。

 typedef std::array,128> TileGrid; TileGrid map ; ... TileGrid& GetTiles(){ return map; } 

通过引用返回以防止昂贵的副本,并且因为该函数只是一个getter而且该对象保持了map所有权。

编辑:固定为getterfunction

C / C ++有两种类型的内存 – 堆栈和堆。 通常,变量在堆栈上分配,这是临时存储,并且在退出当前作用域时标记为可重复使用 – 例如当您结束循环或从函数返回时。

当你使用new ,它将分配堆内存,它将一直存在,直到你使用delete但你必须小心你匹配所有新的和删除调用,这样你就不会出现内存泄漏。 在C ++中管理这种情况有很多策略。 你可以谷歌搜索“用C ++进行内存管理”来了解更多信息。

在您的简单情况下,我建议避免指针,但使用stl容器来构建您的tile数组。 例如std :: vector就像vector< vector > map 。 您可以使用相同的方括号语法来访问地图,例如map[x][y] = Tile(); 这样,数组的内存分配和管理在vector类中处理。