当前位置: 首页 > 知识库问答 >
问题:

比较悬空指针合法吗?

乐成济
2023-03-14

比较悬空指针合法吗?

int *p, *q;
{
    int a;
    p = &a;
}
{
    int b;
    q = &b;
}
std::cout << (p == q) << '\n';

请注意pq是如何指向已经消失的对象的。这合法吗?

共有1个答案

袁波
2023-03-14

简介:第一个问题是使用p的值是否合法。

被销毁后,p将获取所谓的无效指针值。引自N4430(关于N4430状态的讨论见下面的“注释”):

当一个存储区域的持续时间结束时,表示被释放的存储的任何部分的地址的所有指针的值都成为无效指针值。

上述引语中使用的术语意味着需要LVALUE到RVALUE的转换,如C++14[Conv.LVAL/2]:

当LValue到RValue的转换应用于表达式e时,并且[...]glvalue引用的对象包含无效的指针值,行为是实现定义的。

历史:在C++11中,这个说法是未定义的,而不是实现定义的;它被DR1438改变了。请参阅这篇文章的编辑历史以获得完整的引号。

关于N4430的注意:这是对C++14提出的缺陷解决方案,尚未被接受。它清理了围绕对象生存期、无效指针、子对象、联合和数组边界访问的大量措辞。

在C++14文本中,在[basic.stc.dynamic.deallocation]/4和后续段落中定义了当使用delete时出现无效指针值。然而,它没有明确说明相同的原则是否适用于静态存储或自动存储。

[basic.composite]/3中有一个“有效指针”的定义,但它太模糊了,不能敏感地使用。[basic.life]/5(脚注)引用了相同的文本来定义指向静态存储持续时间对象的指针的行为,这表明它适用于所有类型的存储。

在N4430中,文本从该部分向上移动了一个级别,以便它清楚地适用于所有存储持续时间。附上一张纸条:

起草注意:这应该适用于所有可以结束的存储持续时间,而不仅仅是动态存储持续时间。在支持线程或分段堆栈的实现中,线程和自动存储的行为方式可能与动态存储相同。

我的观点:除了说p获取了无效的指针值之外,我看不出有任何一致的方法来解释标准(前N4430)。除了我们已经看过的内容之外,这种行为似乎没有被任何其他部分涵盖。因此,我很乐意将N4430的措辞视为在这种情况下代表标准的意图。

 类似资料:
  • 我可以将指向结构的指针类型转换为带符号的值以返回不同类型的错误吗。C标准是否允许这种行为,或者是一种未定义的行为。 我怎样才能让这个条件起作用?

  • 指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位编译器指针大小为4字节,64位编译器指针大小为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。 int a = 100; int *p; p = a; //把a的值赋值给指针变量p

  • 我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。

  • 问题内容: 有可能这可能是一个双重问题。我将String变量初始化为null。我可能会或可能不会使用一个值更新它。现在我想检查此变量是否不等于null以及我尝试执行的操作是否会得到null指针异常。空指针异常,因为它代价高昂。是否有任何有效的解决方法.TIA 问题答案: 如果您使用 你 不会 得到。 我怀疑你在做什么: 这是因为null 而引发,而不是因为null。 如果仍然无法解释,请发布您用于

  • 我已经更新了我的项目中的一些依赖关系之后,我的Hibernate配置类显示Nullpointerx的。 我将SpringDataJPA存储库与hibernate一起使用,已经超过24小时了,仍然没有找到任何关于小问题的适当解决方案。 我已经尝试过的一些解决方案:- 使用@bean(name=“entityManagerFactory”)提供bean名称 我面临的问题 波姆。xml文件 配置类 db

  • 如果您没有要分配的确切地址,将指针NULL分配给指针变量始终是一个好习惯。 这是在变量声明时完成的。 指定为NULL的指针称为null指针。 NULL指针是一个常量,其值为零,在几个标准库中定义,包括iostream。 考虑以下程序 - #include <iostream> using namespace std; int main () { int *ptr = NULL; co