我知道有3 general ways来修改C ++中new和delete的行为:
对new / delete的行为执行这些修改有哪些限制?
特别是新签名和删除签名可以使用的签名有限制吗?
如果任何替换版本必须具有相同的签名(否则它们不会被替换或者会破坏其他代码,例如STL),这是有道理的,但允许全局放置或类特定版本返回智能指针或一些自定义句柄,例如?
答案 0 :(得分:3)
首先,请勿将新/删除表达式与operator new()
函数混淆。
表达式是执行构造和销毁的语言构造。运算符是执行内存(de)分配的普通函数。
只有默认运算符(operator new(size_t)
和operator delete(void *)
可以与默认的new
和delete
表达式一起使用。所有其他表单都简称为“展示位置”表单,并且对于那些你只能使用new
的人,你必须通过调用析构函数手动销毁对象。放置形式是相当有限和专门的需要。到目前为止,最有用的放置形式是全局放置 - 新,{{1但是,它的行为甚至无法改变(这可能是为什么它是唯一受欢迎的行为)。
所有::new (addr) T
运营商必须返回new
。这些分配功能远比你所欣赏的低,所以基本上你“知道什么时候需要弄乱它们”。
重复:C ++分离了对象构造和内存分配的概念。您所能做的就是为后者提供替代实现。
答案 1 :(得分:0)
当你在一个类中重载new和delete时,你正在有效地修改为类分配和释放内存的方式,要求它为你提供这种控制。
当一个类想要使用某种池来分配其实例时,可以进行此操作,无论是为了优化还是为了跟踪目的。
与几乎任何运算符重载一样,限制是您可以传递的参数列表,以及它应遵循的行为。