我在 CPPCon 上看过一个演讲,back to basic: class layout链接是这个。在 54:20,他说两次删除 nullptr 是未定义的行为。据我所知,C++ 标准保证删除 nullptr 没有任何作用,但为什么删除 nullptr 两次是未定义的行为?
之前有人告诉我,不需要检查析构函数中的 ptr 是否为空,因为删除空指针是有效的。但是如果两次删除一个空指针是未定义的,这是否意味着我仍然需要检查它是否为 nullptr 以防止发生双重删除?
这是作者从他的视频中的转录:
[...] 忽略标准,然后又遇到了问题。我看到的一个常见示例是可以删除空指针,这很好,但是如果不将值重置为某个有效指针值,就不能删除它两次。如果我删除相同的指针两次,如果它不是空的,你可能会得到一个段错误,如果它是空的,它通常只是碰巧工作,但不能保证工作,实际上在 1980 年代有一个编译器在那里它不会工作,因为当您删除指针时,删除的指针中会覆盖一个新值。因此,再次遵循标准。
在 C++ 中两次删除 nullptr 是否安全?
是(在 C++ 的所有标准版本中)。它保证工作(通过工作,我的意思是它不做任何事情)。
如果参数是空指针,则删除无效。演示者描述的编译器不符合 C++ 标准。所描述的编译器也是 80 年代的,所以它是在 C++ 标准化之前制作的。演示者说如果他们指的是标准 C++,这似乎是隐含的,则不能两次删除空指针是错误的。
确实,删除可能会间接导致程序表现得好像参数指针的值被更改了(并且根据 as-if 规则,这意味着它们可以有效地更改值),但仅在指针不存在的情况下null 并因此因删除而无效。事实上,这种允许适用于所有具有相同值的指针对象,因为它们因此全部无效。这是因为所有可以观察无效指针值的方法要么是未定义的,要么是实现定义的行为。
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |