我正在将我的游戏引擎从 Java 移植到 C++。我一直在对自定义内存分配器进行大量研究,因为我现在需要担心内存管理。我读过的关于该主题的每篇文章都说您应该重载new
anddelete
运算符。但是,这些重载的运算符通常只是委托并调用处理内存分配的自定义函数。此外,通常使用宏,例如:
#define New(className, size, description) customNew(className, size, description, __FILE__, __LINE__)
它甚至从不使用重载new
运算符,而只是调用自定义方法。我了解宏如何有用,因为您可以很好地获取文件名和行号,但是为什么要重载new
以及delete
如果在代码中您只是要使用宏New
而不是运算符。
new
此外,当我们的自定义分配器可能想知道附加信息(例如描述、文件名和行号)时,覆盖(而不是重载)默认值似乎毫无意义。我们不可能知道关于标准调用的信息new
,也不能以有意义的方式将其委托给我们customNew
。
我没有看到重载和覆盖这些运算符的巨大好处。
在我看来,调用:
customNew(className, size, desc, file, line);
比调用重载更直观new
:
new (size, desc, file, line) className();
最后,如果我要覆盖和超载,最好的地方是哪里?每堂课都这样做是令人讨厌的乏味。可以通过命名空间来完成吗?我计划为每个子系统设置单独的项目,以便它们可以独立维护。我将如何促进跨项目以及游戏项目内的覆盖和重载?请原谅我的 C++ n00bishness。有一阵子了。