是否使用无效指针未定义行为初始化指针声明符?

Már*_*ldi 5 c++ undefined-behavior language-lawyer invalid-pointer

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

int main()
{
    int *p = <some invalid pointer value>;
}
Run Code Online (Sandbox Code Playgroud)

有关编译示例,请使用以下代码:

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

我对这个主题做了一些研究,所以这些是我到目前为止发现的相关信息:

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

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

另外,根据cppreference,

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

该线程解决了无效指针的一些用途.具体而言,这个答案提到了基本原理文件(C99),其中有以下段落(第6.3.2.3节):

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

我不确定C++的状态是什么,但我认为,鉴于链接线程的答案,使用无效指针会导致未定义的行为.但请注意,该分配初始化不同,因此我不确定初始化是否被视为一种用法.

Dav*_*ing 4

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

\n


归档时间:

查看次数:

224 次

最近记录:

7 年,6 月 前