删除后 C 中的指针
考虑 C 中的以下代码片段:
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // Undefined behavior in C++11 A* d = b; // Potentially legal, but uncertain</code>
此代码引发问题:在删除原始指针后访问复制指针的值会发生什么?
在 C 11 中,访问已删除的指针的值会导致未定义的行为。这适用于指针 a 和 b。将 a 的值复制到 c 中也是未定义的,因为 a 指向已释放的内存。
但是,在 C 14 中,该行为变为实现定义的。该标准指定:
“通过无效指针值进行间接访问以及将无效指针值传递给释放函数具有未定义的行为。无效指针值的任何其他使用都具有实现定义的行为。”
因此,在 C 14 中,访问 b 的值(a 的副本)也是实现定义的。它可能会导致未定义的行为,但也可能通过特定的实现以不同的方式处理。
总之,A* c = a;且 A* d = b;在 C 11 中未定义,在 C 14 中实现定义。这是因为指针 a 和 b 在删除操作后都指向无效内存。
以上是删除原始指针后,C 中复制的指针会发生什么?的详细内容。更多信息请关注PHP中文网其他相关文章!