【问题标题】:realloc vs memcpy in dynamic array like vector in C动态数组中的realloc vs memcpy,如C中的向量
【发布时间】:2020-07-20 08:55:27
【问题描述】:

我在 C 中使用数据结构向量。像这样

struct intVector 
{
  int* head;

  size_t capacity;
  size_t size;
};

在实现 pushIntVector 函数时,当数组的大小等于容量时,我有两种选择。在这种情况下,我需要分配更大的内存并将所有数据复制到其中并释放旧分配的数据。正如文档所说,realloc 函数为 ptr 重新分配内存,而 memcpy 函数将内存从 A 复制到 B。

乍一看,realloc 似乎很适合我的情况,因为我不必负责复制内存和释放旧内存,但如果在线性模式下没有这么大的内存怎么办。另一方面,如果我在其他地方分配一些更大的内存,我可以找到一个并轻松复制到它并释放旧的。所以在这里我无法弄清楚在我的情况下使用哪个。

【问题讨论】:

  • Malloc 也需要连续内存,这对您有什么帮助?
  • "如果线性模式下没有这么大的内存怎么办。"如果realloc因此而失败,那么是什么让你认为malloc也不会失败?
  • This answerthis discussion 似乎相关
  • 如果您发现我的解释回答了您的问题,您可以通过点击帖子旁边的复选标记接受它作为正确答案。

标签: c memory vector data-structures memory-leaks


【解决方案1】:

特别是在处理内存时,仔细阅读文档很重要。简单来说,当请求比当前分配更多的内存时,realloc 可以通过三种方式表现:

  • 在保留原始内容不变的情况下扩展分配区域
  • 分配新内存块并复制现有数据
  • 失败(通常但不总是,由于内存不足错误)

这两个非错误结果都离开了包含原始数据的内存,并且永远不需要 memcpy。所以在这种情况下,你绝对应该使用 realloc 而不使用任何 memcpy。如果你用 realloc 命中失败案例,你将用 malloc 命中失败案例。好的做法是检查所有内存管理函数的返回,并在失败时释放所有程序资源并正常退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2013-04-21
    • 2012-08-28
    • 2016-08-12
    相关资源
    最近更新 更多