【发布时间】:2010-12-29 23:09:42
【问题描述】:
This MSDN page 提到没有new 和delete 的版本。 nothrow new 是众所周知的事情 - 如果内存分配失败,则返回 null 而不是抛出异常。但是那里提到的nothrow delete 是什么?
【问题讨论】:
标签: c++ visual-c++ memory-management
This MSDN page 提到没有new 和delete 的版本。 nothrow new 是众所周知的事情 - 如果内存分配失败,则返回 null 而不是抛出异常。但是那里提到的nothrow delete 是什么?
【问题讨论】:
标签: c++ visual-c++ memory-management
他们可能指的是原始内存分配函数operator new 和operator delete。
当您调用特定版本的placement new-expression(即带有额外参数的new-expression;它们都被正式称为new的placement形式)和内存分配函数@ 987654324@ 成功,但进程稍后由于某些其他原因失败(构造函数抛出),实现必须中止进程并通过调用适当版本的operator delete 自动释放分配的内存。在这种情况下,operator delete 的“适当版本”是与之前用于内存分配的operator new 函数具有相同参数集的版本(当然,第一个参数除外)。
这也适用于operator new 的nothrow 版本。当您使用nothrow 形式的new-expression 时,它会调用operator new 的nothrow 版本,然后在分配的内存中构造对象。如果构造函数失败(抛出),new-expression 的实现在nothrow 版本的operator delete 的帮助下释放分配的内存。这基本上是这个版本的operator delete 存在的唯一原因。
换句话说,operator delete 的nothrow 版本存在于非常特定的内部目的。您通常不应该自己调用它,也许您真的不需要知道它的存在。然而,值得知道的是,由于上述原因,每当您创建自己的带有额外参数的operator new 版本时,提供具有相同额外参数集的operator delete 的匹配版本总是一个好主意。
【讨论】: