重载新建和删除与自定义分配器

Overloading new and delete vs Custom Allocator

我应该如何处理 class 的自定义内存分配。我已经看到这两种方法都被广泛使用。使用自定义分配器,就像所有 stl 容器所做的那样,这使它成为带有模板类型参数的类型的一部分。或者重载 newdelete 函数以及可能的放置 new 和放置 delete。我已经访问并阅读了关于这两种技术的许多问题和答案,但我无法弄清楚在特定情况下应该使用哪一种。显然,所有 stl 容器在设计时都考虑了自定义分配器。为什么不重载 newdelete (等)来满足您的内存需求?在我看来,重载 newdelete 可以完成分配器可以完成的所有事情,实际上可能更容易,麻烦更少。这在 C++17 中尤其如此,它带有大量可能的重载,甚至可以指定对齐要求、不抛出标记版本等。

我们被告知在 C++ 中我们通常应该使用 newdelete 进行典型的堆分配(或更频繁地使用智能指针,但这不是 "smart" 的讨论现在,这是低级别)。但是,如果我们使用分配器而不是 .allocate() 来分配我们的对象,然后使用 .construct() 进行构造(我相信最后一个函数现在已被弃用)会怎么样。我们基本上会做 new std::string{"Hello"} 正在做的事情。

C++ Core Guidelines 唯一提到的是 this(即什么都没有)。我真的找不到其他东西了。那么线程安全和保障呢?我推测(自定义)内存管理可能是高级 c++ 最重要的方面,所以我必须准确理解我在做什么。

我的问题是选择两种方法中的哪一种来管理我自己的内存 class、实现自定义内存分配器(如 stl 容器)或重载 newdeletenew[]delete[]、展示位置 new ... 为什么?其他一些关于何时何地的良好做法和指南也会非常有帮助。提前致谢。

广义上讲,当一种类型的对象(通常是容器)需要管理内存以容纳一个或多个对象时,会使用 Allocator 类型 其他类型的对象 .当 类型 的对象需要一些特殊的内存管理时,使用 class 中的重载 operator newoperator delete