C 中删除后的指针
在 C 中,内存管理至关重要,其中一个关键方面是删除对象后处理指针。以下代码提出了删除后指针有效性的问题:
A* a = new A();
A* b = a;
delete a;
A* c = a; // illegal in C 11
A* d = b; // is it legal?
了解删除后指针的有效性
根据C标准,在相应的对象被删除后引用指针指向的存储未定义,可能会导致不可预测的行为。这适用于原始指针(本例中为 a)和该指针的副本 (b)。
在 C 11 中,删除 a 后访问 a 或 b 的值是未定义的行为。 C 14 标准澄清了这种行为,指出这两个操作都具有实现定义的行为。这意味着结果取决于编译器或运行时环境的具体实现。
实现定义的行为
如前所述,C 14 考虑使用无效指针(包括已删除指针的副本)以具有实现定义的行为。这意味着不同的编译器或操作系统可能会以不同的方式处理这些情况。
某些实现可能会生成系统生成的运行时错误,而其他实现可能会表现出不可预测的行为或终止程序。因此,必须避免使用引用已删除对象的指针,包括这些指针的副本。
结论
总之,访问指针的值(或其副本)在删除关联对象后是危险的,并且可能导致未定义或实现定义的行为。确保指针始终指向有效对象并适当处理内存管理以防止此类问题至关重要。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3