【问题标题】:What C++17 standard say about calling delete on nullptr?关于在 nullptr 上调用 delete 的 C++17 标准怎么说?
【发布时间】:2018-05-01 11:31:41
【问题描述】:

C++03 标准说法:

5.3.5 删除

[...] 在任一替代方案中,如果 delete 的操作数的值是空指针,则该操作无效。[...]

char *p = nullptr;
delete p; //no effect

也就是说,在c++中删除空指针是有效的。

关于在 nullptr 指针上调用 delete 的 C++17 标准有何规定?

【问题讨论】:

  • NULL 是一个整数。你应该用nullptr初始化指针。
  • @PiotrKocia 我做了更正。谢谢。
  • @PiotrKocia NULL 或 0 对指针初始化有效。 nullptr 在 C++03 中不存在。
  • @manni66 是有效的,但是将 NULL 传递给模板 == 错误。使用 NULL 是一种不好的做法。 nullptr 应改为使用。问题标记为c++1z,而不是c++03

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


【解决方案1】:

是的,它是有效的,它会导致一个 noop。 reference

如果表达式的计算结果为空指针值,则不调用析构函数,也不调用释放函数。

【讨论】:

    【解决方案2】:

    对于析构函数,[expr.delete]/6:

    如果 delete-expression 的操作数的值不是空指针值,delete-expression 将调用对象的析构函数(如果有)或者被删除的数组元素。

    这在技术上并不是说如果操作数一个空指针值,析构函数就不会被调用。可能是一个小的措辞问题?

    对于解除分配,[expr.delete]/7:

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

    未指定的释放,但可能没有破坏。

    还要注意,来自[basic.stc.dynamic.deallocation]/3,它澄清了即使在这种情况下调用标准库释放函数,也没有效果:

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

    【讨论】:

    • 释放函数可能会被调用,也可能不会被调用,但如果它被调用并且没有被用户覆盖,它什么也不做。 6.6.4.4.2 “提供给释放函数的第一个参数的值可能是空指针值;如果是这样,并且释放函数是标准库中提供的函数,则调用无效。”
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多