2

我环顾四周试图弄清楚我是否应该在 C++ 中返回一个二维数组,但得到的答案好坏参半。

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

所以,我的困境:

我有一个包含指向Tile对象的指针的二维数组

Tile* map[128][128];

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

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

4

3 回答 3

4

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

解决这个问题的两种常见方法是:

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

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

vector<vector<Tile>> map;
于 2012-12-11T02:04:35.467 回答
3

您得到的 2 个答案是由于这两种不同的方式是可能的。

基于堆栈 - 本地内存,已释放且返回的指针无效

typedef int *(*TileGrid)[128];
Tile* map[128][128];
....
TileGrid GetTiles(){
    return map;
}

Heap Allocated - 在堆上分配并且在函数结束后不被释放,直到这个函数的调用者去释放 -安全

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 函数

于 2012-12-11T02:12:04.433 回答
1

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

当你使用new它时,它会分配堆内存,直到你使用它,delete但你必须小心匹配所有的 new 和 delete 调用,以免发生内存泄漏。在 C++ 中有许多管理这种情况的策略。您可以在 Google 上搜索“C++ 中的内存管理”以了解更多信息。

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

于 2012-12-11T02:12:29.197 回答