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

3
如何为我的类实现自定义内存分配?我见过两种广泛使用的方法:使用自定义分配器,就像所有STL容器所做的那样,将其作为模板类型参数的一部分。或者重载newdelete函数,可能还包括放置new和放置delete。我已经访问并阅读了很多关于这两种技术的问题和答案,但我无法确定在特定情况下应该使用哪种技术。显然,所有STL容器都是根据自定义分配器设计的。但是,为什么不重载newdelete(等等),以满足您的内存需求呢?对我来说,重载newdelete可以完成分配器能完成的一切,事实上可能更容易,更少麻烦。这可能在C++17中尤其正确,因为它带有大量可能的重载,甚至可以指定对齐要求、nothrow标记版本等。
我们被告知,在C++中,通常应该使用newdelete进行典型的堆分配(或更频繁地使用智能指针,但这不是一个“智能”的讨论,而是低级别的)。但是如果我们使用分配器来代替.allocate()来分配对象,然后使用.construct()构造(我相信最后一个函数现在已经过时了)。我们本质上正在做与new std::string{"Hello"}相同的事情。
C++核心指南唯一提到这个问题的地方是this(即没有提到)。我真的找不到其他什么资料了。那么线程安全和安全性呢?我得出结论,(自定义)内存管理可能是高级C++中最重要的方面,因此我必须确切地了解自己在做什么。
我的问题是,在管理自己的类的内存时,选择哪种方法更好:实现自定义内存分配器(类似于stl容器),还是重载newdeletenew[]delete[]、放置new等。为什么?在何时何地使用其他好的实践和指南也会非常有帮助。提前感谢您。

你的类是什么意思? - undefined
@Nelfeal 我大致上来说。何时使用一种方法而不是另一种方法。 - undefined
嗯,总的来说,这取决于你的类是什么/做什么/用于什么。个人而言,除了可能用于调试目的外,我不会过度使用new等操作符。但是,我也不喜欢分配器。类管理内存还有其他方法,最终真的取决于该类的角色。 - undefined
1个回答

4

广义来说,Allocator类型用于当一个对象(通常是容器)需要管理内存以持有其他类型的一个或多个对象时。在类中重载operator newoperator delete被用来处理该类型对象的特殊内存管理需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接