2017-02-03 36 views

回答

5

从[basic.stc.dynamic]:

不限分配和/或在C++程序定义释放函数,包括在 库的默认的版本中,应confrm在3.7中指定的语义。 4.1和3.7.4.2。

从[basic.stc.dynamic.deallocation]:

供给到释放函数的第一个参数的值可以是一个空指针值;如果是这样,并且如果释放函数是标准库中提供的函数,则该调用不起作用。

如果给出在标准库中的释放函数的参数是一个指向不属于空 指针值(4.11),则解除分配功能必须解除分配指针所引用的存储,结束 的区域的持续时间的存储。

如果提供空指针值,则需要释放函数不起作用。这基本上与要求释放函数忽略空pionter值相同。

+4

但是,为什么“_如果释放函数是标准library_中提供的函数呢? – AlexD

+0

@AlexD是的,你让我在那里。 – Barry

+0

@AlexD由于标准库中的标准库是标准可以明确_confirm_在传递'nullptr'时不起作用的唯一标准库。虽然标准明确地要求定制释放函数具有与标准库相同的语义,但C++委员会不能雇佣一个小队去每个程序员的房子或工作场所,并确保他们真的这样做。因此,标准可以说只有100%保证完全符合标准库本身。 –

6

从[expr.delete],

如果的操作数的值删除表达式为空 指针值,它是未指定是否如上所述的解除分配函数将被称为。

所以它听起来像你的用户定义或类特定的删除操作符来处理nullptr

在[class.free]的其他地方,当描述类的解除分配函数时,带有虚拟析构函数的类可以根据动态类型调用解除分配函数。在这种情况下,解除分配函数不需要检查nullptr。

+0

@Barry在我的几秒钟之内得到了他的答案,但我们看了标准的不同部分。 – 1201ProgramAlarm

+0

你的答案是关于删除表达式,而不是删除操作符。 (请参阅评论中的讨论。) – AlexD

+0

@AlexD同样的事情。 'delete ptr;'是一个* delete-expression *,它将调用一个释放函数。 – Barry

相关问题