【问题标题】:Valid constructor invoking in memory management在内存管理中调用的有效构造函数
【发布时间】:2011-09-14 03:34:41
【问题描述】:

我已经编写了自己的内存库,它可以帮助我避免内存泄漏和碎片问题。一切正常。主要问题是它不适用于类。当我调用 my_alloc(size) 时,我想自动调用构造函数(如果存在)。我可以在不重载 new 运算符的情况下做到这一点吗?

【问题讨论】:

  • 这取决于您需要发布更多 API。
  • 我怀疑你自己的内存库并没有真正改进你的操作系统提供的 malloc 实现。
  • @DeadMG:这是一种线性分配器。如果不详细说明,则类似于: void *memory_pool = malloc(10000); void *my_alloc(size) { return first_free_section_in_memory_pool; }
  • 我怀疑它隐藏了内存泄漏而不是避免它们。
  • 标准内存管理器已经开发了 2 多年,它非常好。如果没有同等数量的工作,您不太可能改进它(即您已经落后于曲线 30 人年)。

标签: c++ memory memory-management malloc new-operator


【解决方案1】:

您可以在分配的内存上使用 placement new 来调用构造函数,而无需让 new 进行分配。

重载new有什么问题?

【讨论】:

  • 谢谢!正是我需要的。重载新的并没有错,但我有一些细节为什么我不能这样做。其中之一是由于我的应用程序的特定性,我一次使用多个“内存模块”。所以当我调用 my_alloc(ctx,size) 时,我总是需要传递一个“ctx”作为参数。这就是为什么我不能只重载“新”。
  • @Oleg :错误的假设;当您重载new 时,您可以添加额外的参数。所以你会打电话给T* ptr = new(ctx) T(ctorArgs);
【解决方案2】:

检查您的 C++ 实现。其中一些(我认为 G++ 编译器会这样做)调用 C 运行时 malloc 以获取 new 的内存,然后调用构造函数。

如果您有其中一种实现,您需要做的就是正确覆盖标准库 malloc 和 free 函数(阅读库内部文档),C++ 将自动运行。

【讨论】:

  • 没有合法的方式来覆盖 malloc/free
  • @Martin:许多库都提供了旨在允许覆盖 malloc 和 free 的钩子。
  • @Martin:glibc 提供 __malloc_hook、__realloc_hook、__free_hook 等。
  • @Martin:我也相信 glibc 函数被定义为弱函数,这允许它们被任何其他同名函数覆盖。这使您可以加载自己的 malloc 库。
  • @Zan Lynx:只要你下定决心,一切皆有可能。这并不意味着它是合法的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2014-01-02
  • 2014-06-11
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
相关资源
最近更新 更多