【问题标题】:What are the reasons to override new and delete operator for a specific class?为特定类覆盖 new 和 delete 运算符的原因是什么?
【发布时间】:2012-01-13 09:28:51
【问题描述】:

动态内存分配运算符 - new 和 delete 可以为特定类覆盖。我可以定义与 Windows 上 C++ 运行时提供的默认值不同的内存分配方案。我有几个相关的问题:

  1. 是否为特定的可移植类重写 new 和 delete 运算符,使其也适用于 unix?它是 C++ 标准的一部分吗?

  2. 在哪些情况下可能需要您覆盖特定类的内存分配运算符?我能想到的唯一情况是 - 跟踪内存分配是否存在泄漏。

【问题讨论】:

  • 您似乎首先认为它是 Windows 功能,然后询问它是否可移植到标准?似乎是一种倒退的方式!
  • @Tomalak - 我没有假设任何事情。什么说法让你感到困惑?我可以重温一下。

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


【解决方案1】:

如果您需要自动使用不同的内存,例如内存池或共享内存。

还有...许多其他原因:Why would one replace default new and delete operators?

【讨论】:

    【解决方案2】:

    如果您想以不寻常的方式对齐收件人。例如,前段时间我将收件人设为 8,并将后三位用于其他目标

    如果你想在预初始化的内存中定位新的类实例。例如,如果您想从空节点列表中添加新节点。

    【讨论】:

      【解决方案3】:

      是的,它是可移植的,但要注意 MS 编译器处理它的“nothrow”部分与 ANSI 标准不同 - 被烧毁了。

      至于为什么,是的,跟踪内存、跟踪泄漏、跟踪分配都很好,但这些都可以在全局范围内完成。您可以为 VRAM 分配之类的东西覆盖 new/delete,但我通常会在不同的函数中看到这种东西。重写 new/delete 的最大原因是,如果您对内存系统的使用方式有更好的了解,并且可以比供应商提供的漂亮但通用的 new/delete 版本更有效地定制您的功能。小对象分配是经常被忽视或实施不佳的东西,以及您希望通过分配传递多少信息以用于调试目的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        相关资源
        最近更新 更多