【问题标题】:C++: If I overload new operator, do I have to overload the delete operator too?C++:如果我重载 new 运算符,我是否也必须重载 delete 运算符?
【发布时间】:2019-02-09 00:13:12
【问题描述】:

我正在阅读关于 SO 的问题,在其中一个 answers 中,它被提及为:

如果找不到明确匹配的解除分配函数, 传播异常不会导致对象的内存 释放。

所以,如果我只是重载 new 运算符而不是 delete 运算符,是否会创建和调用任何默认的 delete 运算符?或者,我是否还必须明确编写 delete 运算符。

【问题讨论】:

  • 当你重载的new无异常成功时?如果您有特定情况,请在您的问题中添加该代码示例并提供一些上下文。
  • 这篇文章谈到了新的安置。无论您是否重载某些东西,常规运算符 new 总是有一个匹配的 delete。
  • @n.m.,我同意你所说的关于常规新的说法,新放置会调用什么?会有任何默认值还是什么都没有被调用?
  • @Azeem,当我调用 new 并且构造函数抛出异常时。
  • 正如文章所说,如果找不到匹配的操作符删除,则不会调用任何内容。

标签: c++ new-operator dynamic-memory-allocation delete-operator


【解决方案1】:

这意味着如果你用额外的参数重载 operator new,而不是用额外的参数重载相应的 delete,如果在构造函数中发生异常,则不会调用 delete 运算符。另一方面,如果你重载了基本的 new(没有额外的参数),并且发生了异常,将调用没有额外参数的 delete,如果你没有重载它,那将是默认的 operator delete。

【讨论】:

  • 为了明确起见,所以如果我用一些参数调用 new ,将调用具有相同参数的删除,对吗?
  • 如果operator new函数返回后调用的构造函数(其中一个)抛出异常,是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2017-07-20
  • 2018-01-14
  • 1970-01-01
  • 2012-08-04
  • 2014-03-26
相关资源
最近更新 更多