代码之家  ›  专栏  ›  技术社区  ›  KeyC0de

重载new和delete vs自定义分配器

  •  1
  • KeyC0de  · 技术社区  · 7 年前

    我应该如何为我的类定制内存分配。我见过这两种方法被广泛使用。使用自定义分配器,就像所有stl容器所做的那样,使用模板类型参数使其成为其类型的一部分。或是过载 new delete 功能和可能的位置 新的 和安置 删除 也。我访问并阅读了许多关于这两种技巧的问题和答案,但我不知道哪一种应该用在特定的情况下。很明显,所有的stl容器都设计了一个定制的分配器。为什么不超载 新的 删除 新的 删除

    我们被告知,在C++中,我们通常应该使用 新的 删除 对于一个典型的堆分配(或者更常见的智能指针,但这不是一个“智能”的讨论,这是低级的)。但是如果我们用一个分配器来分配我们的对象呢 .allocate() .construct() (不过,我相信最后一个函数现在已经被弃用了)。我们基本上会做同样的事情 new std::string{"Hello"} 他在做什么。

    this (即什么也没有)。我真的找不到别的了。那么线程的安全性呢?我推测,(自定义)内存管理可能是高级C++最重要的方面,所以我必须准确地理解我正在做的事情。

    我的问题是,在实现自定义内存分配器(如 stl 容器)或过载 新的 , 删除 new[] , delete[] ,位置 新的 ... 为什么?其他一些关于何时何地的良好做法和指导方针也很有帮助。提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Pete Becker    7 年前

    广义地说,一个 Allocator 当一种类型的对象(通常是容器)需要管理内存以容纳一个或多个对象时,使用类型 其他类型的 operator new operator delete 那种类型的 需要一些特殊的内存管理。