gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:40 26 4
gpt4 key购买 nike

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

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,

Indirection through an invalid pointer value and passing an invalid pointer value to a deallocation function have undefined behavior. Any other use of an invalid pointer value has implementation-defined behavior.

This thread解决一些无效指针的使用。具体来说,this answer提到 Rationale document (C99),其中有以下段落(第 6.3.2.3 节):

Regardless how an invalid pointer is created, any use of it yields undefined behavior. Even assignment, comparison with a null pointer constant, or comparison with itself, might on some systems result in an exception.

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

最佳答案

您几乎自己回答了这个问题:在 C++ 中,它是定义的实现,而不是未定义。标准说 just what you quoted (这是我通过咨询适当的 index 发现的)。不管是否初始化:lvalue-to-rvalue conversion在指针对象上显式构成使用。

关于c++ - 是否使用无效指针未定义行为初始化指针声明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com