我在“C ++ Primer”中学到了一些关于重载new / delete的东西。但我很好奇:因为默认的new / delete非常好,我什么时候应该重载它们?
答案 0 :(得分:3)
当你的班级有特定的内存要求时,你应该只重载它们。例如,如果要确保从内存池中分配Foo
的所有实例。
除了这种事情之外,很少需要超载它们。
答案 1 :(得分:2)
在课程级别,重载它们的通常原因是使用a 内存池。这通常仅适用于非常小的类 会动态分配很多;像图中的节点之类的东西 例如,池分配器可以显着改善位置和 分配/解除分配速度。
您还可以重载全局new和delete运算符以使用special 分配器(比如从内存中的特定区域分配)。这可以 然而,棘手,因为没有办法指定额外的 删除表达式中的参数。实际上,当你这样做时 这个,你还必须替换非放置新的和删除 运营商,并安排新的运营商以某种方式存储 找到正确删除者所需的信息。
当然,虽然不会超载,但您可以替换全局新内容 并删除运算符,以及用于收集的工具 有关分配和删除的信息,用于调试 目的(或因为您有一些自定义展示位置新/删除)。
你应该不对库中的全局新/删除做任何事情。 由于您所做的任何事情都需要更换非放置表格, 在库中执行此操作会带来冲突(如果用户也需要这样做) 它在他的主要申请中。)
答案 2 :(得分:1)
此外,如果您创建自定义分配库,例如TCMalloc,并且您希望程序中new
的所有分配都转到您的库中。
答案 3 :(得分:1)
在他们的愚蠢库中有一个关于Facebook's FBVector类型的有趣文档,它解释了为什么他们为向量使用自定义分配器,特别是它允许就地重新分配,优化增长因子以避免gcc的分配爬行,以及等等。
一般来说,自己做分配是一个坏主意,因为这是一个复杂的问题,需要做出很多权衡决定。
答案 4 :(得分:1)
我想到的一些用例: