当前位置: 首页 > 知识库问答 >
问题:

在C++中,用自身初始化引用或指针会导致UB吗?

慕鸿波
2023-03-14
int &r1 = r1; // r1 0 initialized, `r1` references 0, not UB?
int *p1 = p1; // p1 0 initialized, `p1` is a null ptr, not UB?

int main() {
 
 int &r2 = r2; // reference to intermediate value. has UB ?
 int &r3 = r2; // Also has UB ?
 int *p2 = p2; // pointer to garbage location. has UB ?
 int *p3 = p2; // Also has UB ?

 return 0;
} 
  • 在文件作用域和块作用域中为自身分配引用。
  • 在文件作用域和块作用域中为自身分配指针。
  • 将未初始化的引用分配给另一个引用。
  • 将未初始化的指针分配给另一个指针。

共有1个答案

麹高远
2023-03-14
// namespace scope
int *p1 = p1; // p1 0 initialized, `p1` is a null ptr, not UB?

标准在这种情况下是模棱两可的,但“不是UB”可以合理地争论,因为静态初始化在动态初始化之前。另一方面,标准意味着对象的生存期还没有开始。

关于这里的二义性的更多细节:如果一个全局变量被初始化两次(静态,然后动态),哪个初始化开始它的生存期?

// block scope
int *p2 = p2; // pointer to garbage location. has UB ?

是的。与静态存储持续时间的情况不同,自动对象缺少静态初始化阶段,并且在初始化之前具有一个不确定的值。您正在使用这个不确定的值进行初始化,程序的行为是明确的未定义的。

// block scope
int *p3 = p2; // Also has UB ?

p2的初始化中,行为已经未定义。但假设p2是一个不确定值,没有前面的ub:

int *p2;
int *p3 = p2;

这个例子的行为也是未定义的。

请注意,这些与对象是指针关系不大。这几乎适用于所有类型的对象。

必须初始化引用以引用有效的对象或函数。因此,这三个问题都是:

// namespace scope
int &r1 = r1; // r1 0 initialized, `r1` references 0, not UB?

// block scope
int &r2 = r2; // reference to intermediate value. has UB ?
int &r3 = r2; // Also has UB ?

使程序格式不正确。

 类似资料:
  • 因此,可以将自动变量初始化为陷阱表示,而不会导致未定义的行为,但在变量中存储适当的值之前,不能使用该变量的值。 事实上,他们两个我都听不懂。

  • 当云联壹云的First Node部署成功后,用户可根据使用场景快速引导配置云联壹云平台。 设置管理员用户 当First Node节点部署完成后,用户在浏览器中输入First Node节点的IP地址,如提示“您的连接不是私密连接”,请单击 “高级” 按钮,并单击“继续前往x.x.x.x(不安全)”,打开云管平台控制台。 在管理员注册页面,设置管理员账号、密码,单击 “注册” 按钮,创建管理员用户。

  • 这个问题的后续问题 我们有以下代码: 这种访问是一种未定义的行为吗?一方面,不需要对象来访问静态类成员,另一方面,

  • 本文向大家介绍C++常量详解一(常量指针与常量引用的初始化),包括了C++常量详解一(常量指针与常量引用的初始化)的使用技巧和注意事项,需要的朋友参考一下 1、常量 1.1、常量的初始化: const对象一旦创建后其值就不能再改变,所以const对象必须初始化。这里我们要注意一点,像const int *p和const int &r都并不是const对象。因为const int *p只是表示不能通

  • 我正在尝试使用Go将原型3结构发送到gRPC服务器。该结构具有类型,我似乎可以很好地填充它。当将消息发送到我的gRPC客户端时,我对感到恐慌。 我有原始定义(完整文件在https://github.com/MovingGauteng/geofancy-rs/blob/master/proto/geofancy.proto: 围棋代码是: 堆栈跟踪如下所示:

  • 问题内容: 另一个链接的问题是在使用strcpy()时出现细分错误吗? 我有一个结构: 如何初始化指向上述类型结构的指针,以及如何初始化指向结构内部的10个字符串(incall [])的指针。 我首先初始化字符串,然后初始化结构。 谢谢。 编辑:我猜我用错了字,应该说分配。实际上,我将此结构作为线程的参数传递。线程数不是固定的,作为参数发送的数据结构对于每个线程都必须是唯一的,并且是“线程安全的”