【问题标题】:When realloc shrinks a allocated block, where is the memory free'd?当 realloc 收缩分配的块时,内存在哪里释放?
【发布时间】:2013-03-09 19:28:35
【问题描述】:

我正在构建一个 bigInt 数据类型,它使用一个无符号短数组。在某些函数中,可能会或可能不会使用最高阶的short,但总是分配以防万一。为了防止基本数学运算造成无休止的内存消耗,我只想重新分配数组:

toReturn.numArray = realloc(toReturn.numArray, (sizeof(unsigned short)) * (toReturn.numElements - 1))

但我不知道是释放最高位(理想)还是最低位。

【问题讨论】:

  • 你真的有大小为兆字节的整数吗?否则几乎不需要收缩。
  • 它旨在允许 RSA 暴力破解(学习它)和其他方式难以完成的复杂文件操作。但它不是兆字节,大约是 64 艾字节......
  • @teppic 这就是我所指望的......
  • @Josh - 实际上,忘记这一点 - 我想我正在使用旧信息。
  • @teppic 它只是一个线段。释放在别处完成。

标签: c unix pointers posix realloc


【解决方案1】:

无法保证在缩减大小期间将返回给您的相同内存块会释放一些(缩减)内存。您不应该依赖它,因为它根本无法保证。

C99 标准 7.20.3.4-1:realloc 函数:

realloc函数释放ptr指向的旧对象并返回一个 指向具有 size 指定大小的新对象的指针。新的内容 对象应与释放前的旧对象相同,直到新旧大小中的较小者。新对象中超出旧对象大小的任何字节都具有不确定的值。

【讨论】:

  • 这不是我的问题。我不依赖同一个内存块,我想知道旧块中的什么可以预期存在于新块中,因为新块更小。
  • @Josh:上面的引用也没有回答这个问题吗?引用中非常清楚明确地提到了这一点。全部。
  • 不清楚。字节丢失的隐含信息不在其中。不过我想通了。我是愚蠢的。
【解决方案2】:

如果内存块被重定位,数据将从旧缓冲区的底部复制到新的大小。

如果您想保留数据的顶部,则必须执行malloc/memmove 或类似的操作。

这与您的位的关系取决于您如何将数据映射到块中,我想。这应该是可控的。

【讨论】:

  • 定义旧缓冲区的底部?我不完全确定这是否依赖于字节序。
  • 如果 u16 数组索引 0 是最低阶,索引 [size] 保存最高有效位。
  • @Josh - '旧缓冲区底部' = 'malloc 给你的内存地址,你传入realloc'
【解决方案3】:

来自'man realloc()'

 The realloc() function changes the size of the block pointed
 to by ptr to size bytes and returns a pointer to the (possi-
 bly moved) block. The contents will be unchanged up  to  the
 lesser  of  the  new  and  old sizes.

【讨论】:

  • "不变到较小的.." 所以最左边的字节被保留。即收缩(“123456789\0”到4);将是“1234”,有或没有尾随零。整数和短裤也一样
  • 取决于您的解释。让我们将数字转换为字符串,srink(1) 有以下选项: ((左对齐)"234" and "12" => "2" and "1") 或 ((右对齐并用空格填充) “234”和“12”=>“2”和“”)或((右对齐/用零填充)“234”和“012”=>“2”和“0”) .这只是记忆!
  • 我意识到这只是内存——我关心 realloc 如何处理它!告诉我这两者都没有用!
  • 最左边是明确的。如果你“解释”你的记忆“右对齐”(myval[4] = "0123" 与 yourval[4] = "3","2","1","0"),在你的记忆模型中错误的数据将被截断
  • 我在 C 中初始化一个数组: int *array = malloc(sizeof(int) * 5);数组[0] = 1;数组[4] = 2;哪个仍然可以访问?
【解决方案4】:

好吧,我是个笨蛋。

array = realloc(array, smallSizeNumber);

将数组[0]保留为数组[smallerSizeNumber - 1]。

高位丢失。

【讨论】:

  • "新对象的内容应与释放前旧对象的内容相同,直到新旧大小中的较小者。" 如何这句话没有回答你的问题?
猜你喜欢
  • 2014-03-07
  • 2021-11-25
  • 2018-03-26
  • 2016-11-16
  • 1970-01-01
  • 2014-04-27
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多