c/c++语言开发共享C ++ – 通过函数返回2D数组

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

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

所以,我的困境:

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

Tile* map[128][128];

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

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

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

    两种常见的方法是:

    但那么……谁将释放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类中处理。

      以上就是c/c++开发分享C ++ – 通过函数返回2D数组相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549991.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐