与自定义分配器相比,重载新的和删除的

时间:2018-10-28 16:05:45

标签: c++ overloading new-operator delete-operator allocator

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

我们被告知,在C ++中,通常应将newdelete用于典型的堆分配(或更常见的是智能指针,但这现在不是“智能”讨论,这是低级)。但是,如果我们使用分配器来代替.allocate()来分配对象,然后使用.construct()进行构造(我相信现在不建议使用最后一个函数)。实际上,我们将做与new std::string{"Hello"}相同的事情。

《 C ++核心准则》中仅提及this(即无)。我真的找不到其他很多东西。那么线程的安全性又如何呢?我推测(自定义)内存管理可能是高级c ++的最重要方面,因此我必须确切地了解自己在做什么。

我的问题是选择两种方法来管理自己的类的内存,实现自定义内存分配器(例如stl容器)还是重载new,{{1 }},deletenew[],位置delete[] ...,为什么?其他有关何时何地以及何时进行的良好做法和指南也将非常有帮助。预先感谢。

1 个答案:

答案 0 :(得分:1)

从广义上讲,当一种类型的对象(通常是容器)需要管理内存以容纳某种其他类型的对象时,使用Allocator类型。当类对象需要某种特殊的内存管理时,将使用类中的operator newoperator delete重载。