什么是C ++中的nothrow delete?

时间:2009-12-25 07:53:48

标签: c++ visual-c++ memory-management

This MSDN page提到没有newdelete的版本。 nothrow new是一个众所周知的事情 - 如果内存分配失败,则返回null而不是抛出异常。但那里提到的nothrow delete是什么?

1 个答案:

答案 0 :(得分:18)

它们可能指的是原始内存分配函数operator newoperator delete

当您调用特定版本的placement new-expression(即带有额外参数的new-expression;它们都被正式称为 placement 形式的new)和内存分配时函数operator new成功,但由于某些其他原因导致进程失败(构造函数抛出),实现必须中止进程并通过调用operator delete的相应版本自动释放已分配的内存。在这种情况下,operator delete的“适当版本”是与先前用于内存分配的operator new函数具有相同参数集的版本(当然,除了第一个参数外)。

这也适用于nothrow operator new版本的nothrow。当您使用nothrow形式的new-expression时,它会调用operator new版本的nothrow,然后在分配的内存中构造对象。如果构造函数失败(抛出),则new-expression的实现会在operator deleteoperator delete的帮助下释放已分配的内存。这基本上是此nothrow版本存在的唯一原因。

换句话说,operator delete operator new版本的operator delete用于非常具体的内部目的。你通常不应该自己打电话,也许,你真的不需要知道它的存在。但是,值得一提的是,出于上述原因,每当您使用额外参数创建自己的{{1}}版本时,提供具有相同集合的{{1}}的匹配版本始终是个好主意。额外的参数。