【问题标题】:Is there a realloc equivalent in C++?C++ 中是否有 realloc 等价物?
【发布时间】:2013-06-21 12:59:30
【问题描述】:

在 C 中,我们有 malloc()free()realloc()。在 C++ 中,我们有 new()delete() 及其数组版本。有 C++ realloc 函数吗?我在嵌入式领域实现了一些低级的东西,刚刚意识到没有 realloc 函数可以与 C++ 函数配对,并想确保我没有遗漏任何东西。我猜“放置新”到一个新的、单独的缓冲区是最接近的匹配,但想确定一下。

因为我得到的答案有点远,所以稍微重述一下这个问题。

我已经实现了设备级 malloc/new/realloc/etc。我的嵌入式设备上的函数,并想仔细检查以确保没有我不知道的 C++ realloc 类型函数。

【问题讨论】:

  • 我曾经问过a similar question
  • 有什么理由不使用可扩展的容器,例如std::vector?内存问题?
  • @Huytard 我想他问的不是他是否可以使用 realloc,而是一种更 C++ 的方式来处理 realloc 所适用的各种情况。他也可以使用 malloc 并将他的对象布置为自己的结构,但他宁愿不这样做;)
  • @MichaelDorgan: 是的...基本上,结果是 C++ 中确实不需要这个。 vector 已经作为摊销不变的推回成本,所以实际上没有任何渐近问题开始。
  • @KerrekSB 另一方面,现代分配器能够区分小对象和大对象并以不同的方式处理它们。在类 Unix 平台上,大对象可以(并且在 Linux 上)使用 mmap 分配,并使用 mremap 重新分配,在这种情况下,可能会有一个 从不 复制的 realloc(足够大的块)。

标签: c++ c memory-management


【解决方案1】:

不,没有直接的等价物。您必须自己进行实施。因为一个类真的不应该改变它的大小,这不是一个真正的问题。移动语义可以处理大多数情况。

但是,有些类使用头信息 + 尾端分配的数据。要“正确”编码这些代码,您必须重写 operator new()operator delete() 函数,以便该类处理这些额外的“灵活”数据。您如何“重新分配”数据取决于您的需求。

如果这不能回答您的问题,请发布您正在尝试的示例。

【讨论】:

  • 不错的答案,但我相信上面的@KerrekSB 给了我所需的信息。在这种情况下,我已经或已经编写了所有低级内存分配胶水代码以适应标准分配器,我只是想确保没有我缺少的 C++ realloc 等价物。 +1,谢谢。
  • 我给你奖励,因为其他人都参与了 C++11 争论:)
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多