C++:如果我重载了new运算符,我是否也必须重载delete运算符?

9
我在 Stack Overflow 上看到一个问题,在其中一个 答案 中提到:
如果找不到明确匹配的释放函数,则传播异常不会导致对象的内存被释放。
因此,如果我只重载了 new 操作符而没有重载 delete 操作符,是否会创建并调用任何默认的 delete 操作符?还是我必须显式地编写 delete 操作符。

当您重载的new成功且没有异常或其他问题时,会发生什么?如果您有特定的场景,请在问题中添加该代码示例并提供一些上下文。 - Azeem
这段文字讲述了放置 new。无论您是否重载某些内容,常规 operator new 总是有一个匹配的 delete。 - n. m.
@n.m.,我同意你关于常规new的说法,那么对于放置new会调用什么呢?会有默认值或者什么都不会被调用吗? - pasha
@Azeem,当我调用new并且构造函数抛出异常时。 - pasha
正如该段所述,如果找不到匹配的删除操作符,就不会调用任何操作。 - n. m.
1个回答

8
这意味着,如果您在operator new中使用额外的参数,但未在相应的delete中使用额外的参数,如果构造函数中出现异常,将不会调用任何delete运算符。另一方面,如果您重载基本的new(没有额外的参数),并且发生异常,则将调用没有额外参数的delete,如果您未对其进行重载,则这将是默认的operator delete。

只是为了明确,如果我使用一些参数调用new,那么使用相同参数的delete将被调用,对吗? - pasha
如果在 operator new 函数返回后调用的一个或多个构造函数抛出异常,则是的。 - Chris Dodd

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