7

简而言之,以下代码是否被认为具有未定义的行为?

int main()
{
    int *p = <some invalid pointer value>;
}

对于编译示例,请使用以下代码:

int main()
{
    int *p = new int;
    delete p; // Now p has an invalid pointer value.
    int *q = p; // UB?
}

我已经对该主题进行了一些研究,因此这些是我迄今为止发现的相关信息:

指针值(根据cppreference)可以是以下之一:

  • 指向对象或函数的指针;
  • 超过对象末尾的指针;
  • 空指针值;
  • 无效的指针值。

此外,根据 cppreference,

通过无效指针值的间接传递以及将无效指针值传递给释放函数具有未定义的行为。无效指针值的任何其他使用都具有实现定义的行为。

该线程解决了无效指针的一些用途。具体来说,这个答案提到了基本原理文档(C99),其中包含以下段落(第 6.3.2.3 节):

无论如何创建无效指针,对它的任何使用都会产生未定义的行为。即使赋值、与空指针常量比较或与自身比较,在某些系统上也可能导致异常。

我不确定 C++ 的情况如何,但我认为,鉴于链接线程上的答案,使用无效指针会导致未定义的行为。但是请注意,该分配Initialization不同,因此我不确定初始化是否被视为一种用途。

4

1 回答 1

4

您自己已经回答了这个问题:它是C++ 中定义的实现,而不是未定义的。该标准说明了您所引用的内容(我通过查阅适当的索引找到了)。是否初始化无关紧要:指针对象上的左值到右值转换显式构成使用。

于 2018-05-26T20:44:13.267 回答