【问题标题】:Best way of using malloc and realloc使用 malloc 和 realloc 的最佳方式
【发布时间】:2013-04-11 23:42:04
【问题描述】:

我对使用 malloc 和 realloc 非常陌生,我有几个问题。

问题 1。

我正在制作的游戏允许您创建自己的空间芯片,知道这一点我想知道重新分配两倍于标准的当前内存量是否更好。或者按照为所需顶点重新分配 100 个额外空间的方式做一些事情? 我自己认为第二种选择会更好,但也许有一些我不知道的东西。

问题 2

如果我有一个 malloced 的 squares[20] [4] 数组,我如何将它重新分配到 squares[100][4] 的大小?我是否将第一个数组重新分配到 100,然后将 20-99 重新分配到 4 个新点?

问题 3

现在,当我重新分配数据时,会发生一些奇怪的事情。如果我设置了一个断点,一切都会很好,但如果我让代码同时工作,它就会崩溃。所以我猜有内存泄漏。现在这是我的 realloc 代码。

unsigned char *temp =( unsigned char* ) realloc(realSpaceship, gridSize*sizeof( unsigned char ));
if(temp != NULL)
{
    realSpaceship = temp;
    //free(temp); Line is now deleted at the advice of the helpfull people here.
}
else
{
    //error
    printf("realloc error\n");
    free(realSpaceship);
}

我认为释放 temp 是个好主意,但它只会使代码在不同的位置崩溃。

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!

我刚刚意识到问题不在于 realloc,而在于其他地方。

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!

一点额外的信息。 我正在使用 C++ 而且我也在用glm

【问题讨论】:

  • 您是用 C 还是 C++ 编程?在 C++ 中,malloc 通常是人们在学习后必须un-learn的东西。
  • newnew[]std::vector 是一个选项吗?
  • @DrewDormann 我正在使用 c++,但是为什么我需要忘记 malloc?
  • 释放 temp 时,就是在释放 temp 指向的内存。由于您将 realSpaceship 设置为 temp,因此您还释放了 realSpaceship 指向的内存。如果 realloc 成功,您将需要在将 realSpaceship 设置为 temp 值之前释放它。
  • 您能否展示可以编译以重现错误的最小代码示例?

标签: c++ malloc realloc


【解决方案1】:

老实说,避免多次使用reallocmalloc 一次并坚持下去,直到遇到极端情况,然后 realloc(但即使那样,也要避免它!)

这样做的主要原因是调试和测试。如果程序在realloc 失败,可能有多种原因……而且大部分来自操作系统。 (即内存不足、试图使用刚刚释放的内存等)这些都是难以重现和调试的错误。

做一些数学运算,计算出您的用例所需的最大值和malloc。继续编写其他内容。调试realloc 错误并不好玩。

【讨论】:

  • 感谢您的回答,但我有几点意见和一个问题。我使用的是 8*8*8 构建网格,当玩家升级此网格时,它变为 16*16*16,这就是 realoc 所做的。看到玩家可以升级他们的网格相当多,如果不是必要的话,我不想在一开始就分配大量空间。此外,它自身的 realloc “工作正常”,因为它从未进入 else,但我接缝会导致内存泄漏。你还在说放弃整个 realloc 而是在旧的 malloc 上做一个 free 并创建一个新的 malloc?
  • reallocfree 然后malloc 基本相同,但它可能会保留相同的指针(如果操作系统可以为您提供来自相同地址的连续内存块.) 最大内存使用量为:4,096 (16^3),即 4MB。您的播放器多久升级一次?如果很频繁,你还不如从一开始就malloc 4MB。 512 (8^3),即 512kB 比 4MB 小很多,所以我明白你的意思,但如果你是玩家,几乎所有时间都会从 512KB 变为 4MB,最好坚持使用 4MB 从并避免realloc的内存泄漏。
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多