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

2024-03-24

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

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?
}

我对这个主题做了一些研究,所以这些是我迄今为止找到的相关信息:

一个指针值(根据参考参数 http://en.cppreference.com/w/cpp/language/pointer) 可以是以下之一:

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

另外,根据 cppreference,

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

这个线程 https://stackoverflow.com/questions/3838855/is-storing-an-invalid-pointer-automatically-undefined-behavior解决无效指针的一些使用问题。具体来说,这个答案 https://stackoverflow.com/a/3838889/3646096提到了理由文件 http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf(C99),其中有以下段落(第 6.3.2.3 节):

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

我不确定 C++ 的情况如何,但考虑到链接线程上的答案,我认为,uses无效指针会导致未定义的行为。但请注意,任务不等于初始化,所以我不确定初始化是否被视为一种用途。


你自己几乎已经回答了这个问题:实施定义, not 不明确的,在 C++ 中。标准说就是你引用的内容 http://eel.is/c++draft/basic.stc#:any_use_of_an_invalid_pointer_other_than_to_perform_indirection_or_deallocate(我通过咨询相关机构发现index http://eel.is/c++draft/impldefindex)。是否初始化并不重要:左值到右值的转换 http://eel.is/c++draft/conv.lval#3.3在指针对象上明确地构成一种使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐