重载,覆盖和替换new / delete有什么限制?

时间:2012-01-06 06:26:16

标签: c++ operator-overloading new-operator delete-operator

我知道有3 general ways来修改C ++中new和delete的行为:

  • 替换默认的新/删除和新的[] /删除[]
  • 覆盖重载展示位置版本(覆盖传递给它的内存位置的版本,在创建传递其他类型或数量的参数的版本时重载)
  • 重载类特定版本。

对new / delete的行为执行这些修改有哪些限制?

特别是新签名和删除签名可以使用的签名有限制吗?

如果任何替换版本必须具有相同的签名(否则它们不会被替换或者会破坏其他代码,例如STL),这是有道理的,但允许全局放置或类特定版本返回智能指针或一些自定义句柄,例如?

2 个答案:

答案 0 :(得分:3)

首先,请勿将新/删除表达式operator new() 函数混淆。

表达式是执行构造和销毁的语言构造。运算符是执行内存(de)分配的普通函数。

只有默认运算符(operator new(size_t)operator delete(void *)可以与默认的newdelete表达式一起使用。所有其他表单都简称为“展示位置”表单,并且对于那些你只能使用new的人,你必须通过调用析构函数手动销毁对象。放置形式是相当有限和专门的需要。到目前为止,最有用的放置形式是全局放置 - 新,{{1但是,它的行为甚至无法改变(这可能是为什么它是唯一受欢迎的行为)。

所有::new (addr) T运营商必须返回new。这些分配功能远比你所欣赏的低,所以基本上你“知道什么时候需要弄乱它们”。

重复:C ++分离了对象构造和内存分配的概念。您所能做的就是为后者提供替代实现。

答案 1 :(得分:0)

当你在一个类中重载new和delete时,你正在有效地修改为类分配和释放内存的方式,要求它为你提供这种控制。

当一个类想要使用某种池来分配其实例时,可以进行此操作,无论是为了优化还是为了跟踪目的。

与几乎任何运算符重载一样,限制是您可以传递的参数列表,以及它应遵循的行为。