简而言之,以下代码是否被视为具有未定义的行为?
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,
通过无效指针值间接并将无效指针值传递给释放函数具有未定义的行为。对无效指针值的任何其他使用都具有实现定义的行为。
This thread解决了无效指针的一些用法。具体而言,this answer提及Rationale document(C99),其中包含以下段落(第6.3.2.3节):
无论如何创建无效指针,任何使用它都会产生未定义的行为。即使赋值,与空指针常量进行比较,或与自身进行比较,也可能会在某些系统上导致异常。
我不确定C ++的事态是什么,但考虑到链接线程上的答案,使用无效指针,我会考虑这一点导致未定义的行为。但请注意,赋值与初始化不同,因此我不确定初始化是否被视为使用。
答案 0 :(得分:3)
你自己已经回答了这个问题:它是实现定义,而不是 undefined ,在C ++中。标准说just what you quoted(我通过咨询相应的index找到了)。它是否初始化无关紧要:指针对象显式上的lvalue-to-rvalue conversion构成一个用途。