【问题标题】:Realloc and glocal new/delete operator overridingRealloc 和 glocal 新/删除运算符覆盖
【发布时间】:2015-03-09 11:32:37
【问题描述】:

声明没有 C++ 等效的 C realloc 函数,我在另一个问题中发现这样的事情是由 std::vector 自动管理的,我们应该使用它。 我很好。我想,由于没有其他方法可以重新分配,std::vector 只会为我调用realloc

但是,问题是:如果我重写 newdelete 运算符来管理全局跟踪内存使用情况,则在有人调用旧 C 函数的情况下不会调用它们 (malloc, calloc, realloc, free)。

怎么做? std::vector 替换 realloc 是否正确?

【问题讨论】:

  • 如果您使用的是 C++,则不应针对有人错误地将您的代码与 C 函数一起使用的情况进行设计。
  • 问题是另一个:那个人是标准库本身吗?如果是这样,我该如何解决?

标签: c++ c stdvector realloc


【解决方案1】:

std::vector 不会调用realloc;它将使用它的分配器来完成类似的事情:分配新内存,将对象移动到其中,然后释放旧内存。默认分配器使用operator newoperator delete,因此如果您提供它们,将使用您的替换。

realloc 如果向量包含非平凡的对象,那将是完全错误的做法;它复制原始数据,而 C++ 对象通常必须通过调用其特殊函数来复制或移动。

C++ 库中的任何内容(可能除了operator newoperator delete 的默认实现)都不会直接调用C 分配函数。由于您不应该自己调用它们,因此只有在使用 C 库时才需要担心它们。

【讨论】:

  • 如果您使用调用 malloc 系列函数的 C 库,许多实现允许您使用自己的 malloc 或替换 malloc。您可以使用此机制来跟踪内存分配。并且如上所述,许多 C++ 实现使用 malloc 和 free 作为 new 和 delete 的默认实现。
  • 如果realloc 的版本返回 false 并且在请求不成功时不执行任何操作,那就太好了。
  • @NeilKirk:据我了解,这不太可能对当今的多线程分配器有所帮助。即使旧的和新的大小分配都可以从同一个堆范围(当然不是给定的)中得到满足,仍然不太可能有足够的可用内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多