我应该在我的C++ Win32应用程序中重载new/delete运算符吗?

4

我知道微软曾经建议使用HeapCreate()和HeapAlloc()来覆盖operator new,但那是一段时间以前的事了。更多细节请参见KB139638。

在Win32上,我是否仍然可以从覆盖new/delete中受益?推荐使用哪种实现方法?

谢谢您。


这是那种“如果你想惹麻烦就去做”的情况之一。不过,我还是想看看有没有一个例子可以证明这是可以接受的。 - djeidot
4个回答

6

这篇文章说你可以这样做,而不是说你应该这样做。代码写得很糟糕,不安全。一般来说,提供的new和delete实现对所有常规编程需求都能很好地工作。只有在确定重新实现它们可以解决特定问题时,才应考虑重新实现它们。


2
根据我的经验,每个MSDN示例中的代码都写得非常糟糕,这让我感到好笑。然后我看到那些示例的精确副本一遍又一遍地出现在生产代码中,这让我想要进行一次杀人狂暴。 - John Dibling

3

除非您正在进行非常耗费内存的程序(在这种情况下,在特定位置重载分配器将更为有效),否则重载new和delete运算符的主要好处是为了跟踪分配和释放以进行调试和分析。


就像DEBUG_NEW一样。我明白了。 - djeidot

1

对于大多数情况来说,重载全局new/delete是一个不好的想法。

只有在必要时才应该使用类级别的内存管理(通过重载)。对您的应用程序进行分析,看看瓶颈是否在基于堆的分配/释放上。此外,如果您的类稍后可能会派生出其他类(因为new/deletestatic成员,这会给实现者带来额外的负担),事情会变得更加复杂。

尝试传递一个分配器(具有策略,以便您可以测试哪个最适合您的需求),类似于STL所做的。


1

你有理由这样做吗?没有?那就不要这样做;你不会让自己的生活变得极其痛苦的机会很小。

你有一个应用程序,你已经对其进行了分析,并确定了某些内容的分配/释放是瓶颈吗?因为在你做到这一点之前,我不会担心它。

这对我来说似乎是过早的优化 :-)


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