删除后 C 中的指针行为
在 C 中,删除指针会释放它指向的内存。但是,指向已删除内存的指针的行为变得未定义或实现定义,具体取决于 C 版本。
考虑以下代码:
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // Assuming undefined or implementation-defined in C++11 A* d = b; // Supposed to be legal</code>
读取以下值已删除指针的副本 (b)
在 C 11 中,删除 a 后读取 b 的值是未定义的行为。然而,在 C 14 中,它是实现定义的。这是因为删除 a 后,指针 b 本身就变成了“无效的指针值”。
实现定义的行为
在 C 14 中,使用无效的指针值,包括复制它,具有实现定义的行为。这意味着编译器可以决定在这种情况下做什么。在某些实现中,它可能会生成运行时错误,而在其他实现中,它可能允许操作,但在随后使用指针时会导致未定义的行为。
合法还是未定义?
因此,A* c = a;且 A* d = b;在 C 11 中未定义,在 C 14 中由实现定义。复制的指针值 (b) 被视为无效指针值,其使用取决于实现的定义。
以上是在 C 中删除指针指向的内存后,指针会发生什么?的详细内容。更多信息请关注PHP中文网其他相关文章!