C++ 标准到底在哪里说取消引用未初始化的指针是未定义的行为?

2024-01-07

到目前为止,我找不到如何推断出以下内容:

int* ptr;
*ptr = 0;

是未定义的行为。

首先,5.3.1/1 指出*表示间接转换T* to T。但这并没有说明UB的任何事情。

然后经常引用3.7.3.2/4,说在非空指针上使用释放函数会导致指针无效,并且稍后使用无效指针是UB。但在上面的代码中没有任何关于释放的内容。

上面的代码中的UB是如何推导出来的呢?


第 4.1 节看起来像是候选(强调我的):

a 的左值 (3.10) 非函数、非数组类型 T 可以是 转换为右值。如果 T 是一个 不完全类型,一个程序 需要进行此转换的是 格式不正确。如果对象 左值引用的不是类型的对象 T 并且不是类型的对象 从 T 派生,或如果该物体是 未初始化的,一个程序 需要进行此转换有 未定义的行为。如果 T 是一个 非类类型,右值的类型 是 T 的 cv-unqualified 版本。 否则,右值的类型为 T。

我确信只要在规范中搜索“uninitial”就可以找到更多候选者。

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

C++ 标准到底在哪里说取消引用未初始化的指针是未定义的行为? 的相关文章

随机推荐