繁体   English   中英

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

[英]C++ - Returning a 2D array through function

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

一些问题的答案说不 ,因为数据是本地的功能,当它返回时,阵列指向“垃圾数据”(因为它可以在任何时间被覆盖)。 但是,有些人说“是的,就像普通数组一样返回它”。

所以,我的困境:

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

Tile* map[128][128];

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

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

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

两种常见的方法是:

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

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

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

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

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

编辑:修复了getter功能

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM