C++ c++;是否需要在用户定义的和特定于类的删除运算符中处理nullptr。?

C++ c++;是否需要在用户定义的和特定于类的删除运算符中处理nullptr。?,c++,language-lawyer,delete-operator,nullptr,C++,Language Lawyer,Delete Operator,Nullptr,用户定义的和特定于类的删除运算符是否需要像标准库中的运算符那样忽略nullptr 谷歌群组的并行。来自[basic.stc.dynamic]: < > C++程序中定义的任何分配和/或解除分配函数,包括默认版本 库应符合3.7.4.1和3.7.4.2中规定的语义 从[basic.stc.dynamic.deallocation]: 提供给解除分配函数的第一个参数的值可以是空指针值;如果是,并且如果解除分配函数是标准库中提供的函数,则调用无效 如果给定给标准库中解除分配函数的参数是非空指针 指针

用户定义的和特定于类的删除运算符是否需要像标准库中的运算符那样忽略
nullptr



谷歌群组的并行。

来自[basic.stc.dynamic]:

< > C++程序中定义的任何分配和/或解除分配函数,包括默认版本 库应符合3.7.4.1和3.7.4.2中规定的语义

从[basic.stc.dynamic.deallocation]:

提供给解除分配函数的第一个参数的值可以是空指针值;如果是,并且如果解除分配函数是标准库中提供的函数,则调用无效

如果给定给标准库中解除分配函数的参数是非空指针 指针值(4.11),解除分配函数应解除分配指针引用的存储,结束 存储区域的持续时间

如果提供空指针值,则要求释放函数无效。这基本上与要求解除分配函数忽略空pionter值相同。

来自[expr.delete]

如果删除表达式的操作数的值为空 指针值,未指定是否将如上所述调用释放函数

因此,它听起来像是用户定义的或特定于类的删除运算符来处理
nullptr


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

必须检查标准,但需要良好的编程:确定。以及在何处精确检查。?在书中的某个地方是否明确允许。我从用户定义的删除运算符中找不到任何指示表明它是必需的。cppreference使您看起来似乎不必:。显然,如果您删除
nullptr
它什么也不做,即使您定义了自己的
delete
操作符:“如果表达式不是空指针,…”然后“在此之后,…delete表达式调用释放函数”。cppreference可能不一定具有足够的语言正确性,though@Justin不幸的是,CPPPreference并不是一个可靠的来源。对于一个如此微妙的问题,你真的需要去问标准。@Barry在我回答之前几秒钟就得到了他的答案,但我们看了标准的不同部分。你的答案是关于删除表达式,而不是删除运算符。(关于这个问题,请参见评论中的讨论。)@AlexD同样如此<代码>删除ptr是一个将调用解除分配函数的删除表达式。@Barry
delete expr nullptr
可以调用
删除函数(nullptr)
。不过,据我所知,它没有明确要求
delete函数
nullptr
参数没有影响。但是为什么“如果解除分配函数是标准库中提供的函数?”那么?@AlexD是的,你让我明白了。@AlexD因为标准库是唯一一个标准可以明确确认的库,在传递
nullptr
时没有任何效果。虽然标准显然希望自定义的分配函数具有与标准库函数相同的语义,但是C++委员会不能雇佣一批蠢货去每个程序员的家或工作场所,并确保他们确实这样做。因此,标准唯一能说100%保证完全符合的是标准库本身中的标准。当标准没有确认时,它需要。这些要求不仅限于标准库。例如,“分配函数试图分配请求的存储量。如果成功,它将返回地址…”这是对任何分配函数的要求,而不仅仅是标准库函数。”标准库中的是标准唯一可以明确声明不会违反标准和/或导致不必要的错误的库。虽然标准明确要求他们具有这种行为,但唯一能明确说明的是,100%保证实际满足该要求的是标准本身提供的行为。