我应该如何为我的课程处理自定义内存分配。我已经看到两种方法都被广泛使用。像所有stl容器一样,使用自定义分配器,这会使它成为带有模板类型参数的类型的一部分。或者重载new
和delete
函数,可能还会重载位置new
和位置delete
。我已经访问并阅读了有关这两种技术的许多问题和答案,但我无法弄清楚在特定情况下应使用哪种技术。显然,所有stl容器在设计时都考虑了自定义分配器。但是,为什么不重载new
和delete
(等等)以满足您的内存需求呢?在我看来,new
和delete
的重载可以完成分配器可以完成的所有工作,并且实际上可能会更轻松地完成工作。在C ++ 17中尤其如此,它带有大量可能的重载,甚至可以指定对齐要求,nothrow标签版本等。
我们被告知,在C ++中,通常应将new
和delete
用于典型的堆分配(或更常见的是智能指针,但这现在不是“智能”讨论,这是低级)。但是,如果我们使用分配器来代替.allocate()
来分配对象,然后使用.construct()
进行构造(我相信现在不建议使用最后一个函数)。实际上,我们将做与new std::string{"Hello"}
相同的事情。
《 C ++核心准则》中仅提及this(即无)。我真的找不到其他很多东西。那么线程的安全性又如何呢?我推测(自定义)内存管理可能是高级c ++的最重要方面,因此我必须确切地了解自己在做什么。
我的问题是选择两种方法来管理自己的类的内存,实现自定义内存分配器(例如stl
容器)还是重载new
,{{1 }},delete
,new[]
,位置delete[]
...,为什么?其他有关何时何地以及何时进行的良好做法和指南也将非常有帮助。预先感谢。
答案 0 :(得分:1)
从广义上讲,当一种类型的对象(通常是容器)需要管理内存以容纳某种其他类型的对象时,使用Allocator
类型。当类对象需要某种特殊的内存管理时,将使用类中的operator new
和operator delete
重载。