首页  >  文章  >  后端开发  >  使用从已删除指针派生的指针在 C 中有效吗?

使用从已删除指针派生的指针在 C 中有效吗?

Linda Hamilton
Linda Hamilton原创
2024-11-01 06:30:30439浏览

Is using a pointer derived from a deleted pointer valid in C  ?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn