C 中删除后的指针:a 和 b 的复杂情况
在 C 指针的世界中,删除已分配的指针的行为通过删除内存会引发有关指向该内存的指针有效性的问题。考虑以下场景:
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // illegal in C++11 A* d = b; // legal?</code>
问题的关键在于确定 a 被删除后使用指针 b 的值的有效性。
The Fate of无效指针:C 11 中未定义的行为,C 14 中定义的实现
在 C 11 中,访问已删除指针 (a) 的值会导致未定义的行为。然而,从已删除指针派生的指针 (b) 的使用呈现出一种微妙的情况。
在 C 11 下,c = a;且 d = b;被视为未定义的行为。这是因为 a 和 b 都被视为“无效指针值”,因为它们指向已释放的存储空间。任何对无效指针执行操作的尝试都是显式未定义的。
C 14 中实现定义的复杂性
C 14 对此场景引入了微妙的更改。根据修订后的标准,“使用无效的指针值”包括“复制...的值”。因此,在 C 14 中,对 c 和 d 的赋值均被视为实现定义的。
此更改背后的原因是复制无效的指针值可能会在某些实现上触发运行时错误。该标准明智地让实现来处理它认为合适的情况。
总之,删除 a 后使用 b 的合法性取决于所使用的 C 版本。 C 11 认为 c = a;且 d = b;未定义的行为,而 C 14 将责任转移给实现,而在标准中未指定结果。
以上是使用从已删除指针派生的指针在 C 中有效吗?的详细内容。更多信息请关注PHP中文网其他相关文章!