【问题标题】:Does the C++ linked list (std::list) use new, in relation to a memory heap?与内存堆相关的 C++ 链表(std::list)是否使用新的?
【发布时间】:2012-10-14 22:14:19
【问题描述】:

使用 Visual Studio for c++; std::list 是否使用 new 来分配节点?我问是因为我将内存堆编码为一项挑战,如果它使用新的,则会降低内存堆的有效性。

按照这个问题的内存堆,第一个答案:How to implement a memory heap

如果它确实使用了新的,我将如何修复它(关于使用链表作为上述问题的答案中概述的内存堆)?

谢谢。

【问题讨论】:

  • 是的。此外,您可以对其进行分析并亲自查看。
  • 它如何使用new 当然取决于实现,但它必须使用 some 分配器 somewhere 和实现@987654324 @ 应该是这些的根。 //开始等待有人指出现实生活中的古怪案例
  • 不是重复的;这个问题没有解决内存堆问题。
  • 为什么 operator new 会破坏你的堆?为什么不覆盖 new 和 delete 并让它们使用您的堆实现?

标签: c++ heap-memory


【解决方案1】:

C++ 标准中的 STL 容器(之所以称为 STL 容器,是因为设计基于 STL)具有指定分配器的模板参数。使用该分配器。它默认为库提供的分配器,但您可以传递自己的使用自定义堆的分配器。

【讨论】:

    【解决方案2】:

    所有标准模板库容器都使用抽象(称为分配器)来分配内存,默认为std::allocator<T>。这个默认分配器确实使用了 new,但这并不妨碍您使用(编写)一个不使用的分配器。

    this documentation可以看出,第二个模板参数是要使用的分配器。

    【讨论】:

    • 为了迂腐,容器使用分配器,std::allocator<T> 是默认值。但是分配器不需要是std::allocator<T>
    【解决方案3】:

    是的,它确实通过其Allocator 参数间接使用new。您可以编写一个使用您的堆的自定义分配器,并用它实例化lists。

    【讨论】:

      【解决方案4】:

      是的,std::list 默认使用 std::allocator,它使用new

      但是您可以编写自己的分配器类,使用您想要的任何分配方案并将其作为第二个模板参数传递给 std::list。

      【讨论】:

        猜你喜欢
        • 2019-04-26
        • 2013-03-30
        • 2012-07-17
        • 2020-09-01
        • 1970-01-01
        • 2014-04-12
        • 2017-02-15
        • 2014-12-13
        • 2011-03-26
        相关资源
        最近更新 更多