realloc变种

时间:2012-12-12 17:11:43

标签: c realloc

只是为了定位上下文:它是关于一个字符串池,意思是一个带有字符串键的哈希表(实际上是特殊的字符串知道它们的长度,但我想这个细节在这里是无关紧要的)。关键是当池需要增长时,调整列表数组(用作表桶)的大小。但是 - 这是核心细节 - 包含实际上在单元格数组中的字符串的单元格,而不是在内存的所有角落中展开[1]。因此,我不再需要这些列表,它们只是过时的东西。所以:

  1. 是否存在realloc变体" zeroes"内存区域如calloc? 我在这里需要它,因为这些项不仅是指针,而是列出头:问题是确保空列表/显示为NULL。否则,是memset(p, size, 0);

  2. 的最佳解决方案
  3. 是否有一个realloc的变种,如果没有足够的空间可以在那里增长,那么就不会复制,而只是分配像alloc一样?这里的问题是我不再需要数据,因为字符串需要根据新的模数在列表中重新分配。另外,最好的选择是什么?

    • 使用realloc
    • (免费和使用)使用alloc
    • (free&)使用calloc
  4. 在任何情况下这是否正确:realloc尝试在地方分配更多空间,否则在其他地方分配并静默复制?如果是,那么可能存在一个问题是(至少)有三个用例需要不同的操作 - 在两种情况下都存在或者没有足够的空间 - 但是一个没有选项的单个函数:

    • 我需要更多地方来处理这些数据,而且还需要更多(标准)。
    • 我需要更多地方,但从现在开始数据就是垃圾。
    • 我需要更多的空间和区域,以及#34;归零"。

    对我来说最好的选择是什么?你觉得怎么样?我在哪里可以找到关于该主题的更多反思或信息?

    为什么alloc与calloc和realloc有不同的接口? (我的意思是指定总大小与单一大小和数量)

    [1]这一点最初是为了制作有序套装&地图;对于字符串池,它不是必需的,但不会打扰。相反,它使代码更清晰,并提供引用的位置。

2 个答案:

答案 0 :(得分:4)

  

是否存在realloc变体,将内存区域“归零”为calloc?

没有

  

是否有一个realloc的变体,如果没有足够的空间可以在那里生长,那么它不会复制,而只是分配像alloc一样?

没有

如果我是你,我可能会使用freecalloc。但理想情况下,您希望设计系统,以便重新分配不频繁,因此各种选项的不同性能特征并不重要。换句话说,请确保选择哪个选项无关紧要。

答案 1 :(得分:1)

  

是否存在realloc的变体,将内存区域“归零”   释放calloc?我需要在这里,因为项目不仅是指针,而且   列出头:问题是确保空列表/显示为NULL。   否则,是memset(p,size,0)的最佳解决方案;

如果您严格按照标准进行编码,则会遇到memset。至少这一个很容易解决。

如果您有一些特定于平台的余地,其中一些确实具有recalloc功能。

  

是否存在realloc的变体,如果没有,则不会复制   足够的空间来增长,但只是分配像alloc?   这里的问题是我不再需要数据,因为字符串   需要根据新的模数在列表中重新分发。还有,什么   是最好的选择吗?

不幸的是,再次没有。

有一个proposal for C1X可以添加这两个功能(包括其他功能),但是现在你仍然遇到realloc当前的行为。