【问题标题】:c++ is it required to handle nullptr in user-defined and class-specific delete operators.?c++ 是否需要在用户定义的和特定于类的删除运算符中处理 nullptr。?
【发布时间】:2017-02-03 20:46:38
【问题描述】:

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


并行discussion 在 google 群组中。

【问题讨论】:

  • 必须检查标准,但良好的编程要求:当然。
  • 以及在哪里准确检查。?书的某处明确允许吗?
  • 我找不到任何迹象表明它需要用户定义的删除运算符。
  • cppreference 让您看起来好像不需要:en.cppreference.com/w/cpp/language/delete。显然,如果您删除 nullptr 它什么也不做,即使您定义了自己的 delete 运算符:“如果表达式不是空指针,......”然后“之后,......删除表达式调用释放功能”。但是,cppreference 可能不一定足够正确以用于语言律师的目的
  • @Justin 不幸的是,cppreference 不是一个可靠的来源。对于这个微妙的问题,你真的需要去标准。

标签: c++ language-lawyer delete-operator nullptr


【解决方案1】:

来自[expr.delete],

如果delete-expression的操作数的值为空 指针值,未指定是否会如上所述调用释放函数。

所以听起来像是您的用户定义或特定于类的删除运算符来处理nullptr

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

【讨论】:

  • @Barry 在我之前几秒钟就得到了答案,但我们会查看标准的不同部分。
  • 您的答案是关于删除表达式,而不是删除运算符。 (有关该问题,请参见 cmets 中的讨论。)
  • @AlexD 同样的事情。 delete ptr; 是一个delete-expression,它会调用一个释放函数。
  • @Barry delete-expr nullptr 可以致电 delete-function(nullptr)。尽管如此,据我了解,它并没有明确要求 delete-functionnullptr 参数没有影响。
【解决方案2】:

来自[basic.stc.dynamic]:

在 C++ 程序中定义的任何分配和/或释放函数,包括 库,应符合 3.7.4.1 和 3.7.4.2 中指定的语义。

来自 [basic.stc.dynamic.deallocation]:

提供给释放函数的第一个参数的值可能是空指针值;如果是这样,并且如果释放函数是标准库中提供的函数,则调用无效。

如果标准库中释放函数的参数是一个非空指针 指针值(4.11),释放函数应释放指针引用的存储,结束 存储区域的持续时间。

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

【讨论】:

  • 但是为什么“如果释放函数是标准库中提供的函数”呢?
  • @AlexD 是的,你让我到了那里。
  • @AlexD 因为标准库的那些是唯一标准可以明确确认在通过nullptr时无效的。虽然标准明确希望自定义释放函数与标准库函数具有相同的语义,但 C++ 委员会不能雇佣一队打手去每个程序员的房子或工作场所并确保他们确实这样做。因此,标准可以说 100% 保证完全符合标准的唯一标准是标准库本身中的标准。
  • @JustinTime 该标准并未确认,而是要求。而且这些要求不仅限于标准库。考虑例如“分配函数尝试分配请求的存储量。如果成功,它将返回地址......” 这是任何分配函数的要求,而不仅仅是标准库的。
  • @AlexD 我的意思是,标准库中的那些是标准可以明确声明不会违反标准和/或导致不需要的 UB 的唯一库。虽然标准明确要求他们具有这种行为,但它唯一可以明确声明 100% 保证实际满足此要求的是标准本身提供的那些。
猜你喜欢
  • 2011-11-27
  • 1970-01-01
  • 2016-10-28
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多