是否重载全局 new / delete

今天重构了部分 SagittaEngine 的内存管理模块,和凯丁讨论到重载全局 new / delete 的问题。 sg 中将 new 的重载放在了 sgMemObject 中,要使用 sg 中内存管理器的类,都要继承自 sgMemObject 。

我之前试过一次全局的重载,遇到了点麻烦。在 sgTraceAllocator 中,会对每次内存的申请进行记录。这里用了第三方库记录当前的函数调用栈,而记录内存信息所生成的对象中,也用到了 new 。这便导致了重载的 new 的循环调用。当时可以有两个解决的办法。一是修改 trace 对象,不使用 new 来申请内存;二是放弃重载全局 new。事实上很多建议里都提到了避免重载全局 new 的说法,特别是当你是在写一个库时。因为这意味着你的用户将不得不依赖于你重载的 new / delete 操作。

所以我最后把 new 放在了 sgMemObject 中。而 OGRE, Gamebryo 也是这么做的。

但是凯丁告诉我说 Unreal 是重载全局的。我打开 CryEngine ,发现 CE 也是这么做的。那么是我原来的理念不对吗。我在 Gamedev 上发帖问了这个问题,其中一个人给出了我认为比较合适的答案。

When writing a core game engine like Unreal/CryEngine, you’re basically writing the very core of y