引用未初始化的对象

2024-06-30

在解释问题之前,我想指出我知道给定的示例是糟糕的代码。我已经在看std::shared_ptr以更合理的方式实现我的目标。写这篇文章的原因只是我的好奇心和学习新东西的愿望。预先感谢您的帮助!

今天我的解析器代码有点混乱。优化的东西等等。我专注于一些在解析过程中不必要地克隆的对象实例。我无意中创建了一些全局实例并通过静态方法访问它们。无论如何(强烈简化)我以这个有点有趣的案例结束:

class class_a
{
    class_a();
    class_a& referenceToObject;
};

class_a& getGlobalObject();

class_a::class_a()
:referenceToObject(getGlobalObject())
{}

class_a object;
class_a object2;

class_a& getGlobalObject()
{
    return object2;
}

这显然意味着我做了很多非常错误的事情,但在这个分支,优化是最重要的事情。

我感兴趣的是在更广泛的编译器集合中这样的代码会发生什么。GetGlobalObject()返回对未调用其构造函数的对象的引用。它仍然只返回引用 - 即指向编译时已知的内存空间(数据段或堆上的某个位置,不知道)的指针。

假设没有任何东西会调用任何方法或任何成员object2参考,这个例子是未定义的行为吗?


是的,传递对尚未构造的对象的引用是完全合法的,甚至以某些有限的方式使用此类引用。

[basic.life] ...类似地,在对象的生命周期开始之前但在该对象将占用的存储空间已分配之后,或者在对象的生命周期结束之后且在重用该对象占用的存储空间之前或释放时,任何引用原始对象的左值都可以使用,但只能以有限的方式使用。对于正在构造或销毁的对象,请参阅[class.cdtor]。否则,这样的左值引用分配的存储([basic.stc.dynamic.allocation]),并且使用不依赖于其值的左值的属性是明确定义的。如果出现以下情况,则程序具有未定义的行为:
(7.1) 泛左值用于访问对象,或者
(7.2) 泛左值用于调用对象的非静态成员函数,或者
(7.3) 泛左值绑定到对虚拟基类 ([dcl.init.ref]) 的引用,或者
(7.4) 左值用作 a 的操作数dynamic_­cast([expr.dynamic.cast]) 或作为操作数typeid.

只要你不做上述任何事情,你就没有危险。

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

引用未初始化的对象 的相关文章

  • 选择数据结构

    根据需求使用不同的数据结构 但我如何知道应该使用哪种数据结构 我只是想知道如何选择合适的数据结构 谢谢 此流程图适用于 C 中的 STL 但您可以用 C 实现 STL 容器支持的任何数据结构 列表是一个链接列表 Vector是一个动态数组
  • 为什么禁止在后续私有派生类中简单提及基指针/引用?

    struct B struct D private B B fun return new D ok struct DD public D B foo return 0 error struct B B B is inaccessible 这
  • std::map - 元素访问无异常且无插入

    我有一个使用 std map 的循环模式 我只想在键存在时检索值 否则我不想插入元素 目前我正在使用count key or find key 哪一个更好 从文档来看 复杂性似乎是相同的 如果它们返回一个正值 我就可以访问地图 但是我想避免
  • 策略模式与依赖注入

    策略模式与依赖注入有何不同 即以下是您可以使用策略模式执行的操作 class Foo private readonly ISortAlgo sortAlgo public Foo ISortAlgo sortAlgo sortAlgo so
  • 类内枚举前向声明是否可能? [复制]

    这个问题在这里已经有答案了 我知道在 C 11 中可以转发声明枚举类型 如果提供了存储类型 例如 enum E short void foo E e enum E short VALUE 1 VALUE 2 但我想转发声明一个类中定义的枚举
  • 在 OpenCV C++ 中使用 gpu::GpuMat

    我想知道如何修改gpu GpuMat 事实上我想知道是否可以使用gpu GpuMat like a cv Mat 我想做这样的事情 cv namedWindow Result cv Mat src host cv imread lena j
  • 分段错误(核心转储)

    当我尝试运行此程序时 出现分段错误 核心转储 它编译完美 但我收到错误 我不知道为什么 我已尝试以所有可能的方式编辑我的代码 但仍然收到此错误 我已经没有主意了 任何帮助都会很棒 谢谢 unsigned short reg NULL int
  • 为什么 C# 三元运算符不能与委托一起使用?

    当分支选择函数时 使用三元运算符来选择函数可能是有意义的 但这是不可能的 为什么 public class Demo protected bool branch protected void demo1 protected void dem
  • “constexpr”有什么用?

    我实在是找不到它有什么用处 我的第一个想法是我可以用它来实现 按合同设计 而不使用如下宏 struct S S constexpr int i S i static assert i lt 9 i must be lt 9 S int i
  • Microsoft.Graph GetAsync() 无限期挂起

    介绍 我正在开发一个 ASP NET 应用程序 除其他外 它应该从 Azure Active Directory 检索用户 为此 我使用 Microsoft Graph 版本 1 14 0 预览库 可以找到该库here https www
  • 单元测试依赖注入

    我在用Autofac for IoC 这是我的容器启动器类 其职责是注册依赖项 public class ContainerInit public static IContainer BuildContainer var conFac ne
  • 在运行的 Windows 控制台应用程序中处理拖放文件

    首先澄清一下 我是not询问如何将文件拖放到 exe 图标上 我想知道如何处理拖放到已经运行win32 控制台应用程序 我也是not询问如何通过 Windows 消息泵处理基于 WinMain 的应用程序内部的拖放 我想在带有入口点的程序内
  • 如何从源代码编译picoProlog?

    我是计算机科学专业的学生 正在学习 Prolog 逻辑编程 我发现了一个有趣的 Prolog 解释器 picoProlog http spivey oriel ox ac uk corner Logic Programming http s
  • 尝试写入事件日志时出错 - 无法打开源“SourceName”的日志。您可能没有写入权限

    目前 我们正在尝试将现有的经典 ASP 页面集成到记录事件日志的新方法中 我们通过调用公开为 COM 对象的 NET 程序集来实现此目的 该程序集实际记录到事件日志中 这一切都正常工作 但是当我们尝试写入事件日志时 我们收到错误 无法打开源
  • 在文本文件中搜索字符串的更快方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要使用 C 在一组文本文件中搜索一个大约 13 个字符的字符串 文本文件的数量正在变化 范围在 100 1000 之间 文件大小范
  • 仅仅“抛出”一次捕获有好处吗?

    与一位同事就他将大部分功能包装在 try catch 中的做法进行了 激烈辩论 但 catch 中只有一个 抛出 例如 Private sub foo try Do something catch throw And nothing els
  • C# 我可以访问没有完整限定名称的枚举吗

    我有一个 C 枚举类型 它以非常长的限定名称结尾 例如 DataSet1 ContactLogTypeValues ReminderToFollowupOverdueInvoice 为了便于阅读 如果我可以告诉一个特定的函数只使用名称的最后
  • 在 C++ 中调用函数有多少开销?

    许多文献都谈到使用内联函数来 避免函数调用的开销 但我还没有看到可量化的数据 函数调用的实际开销是多少 即通过内联函数我们可以实现什么样的性能提升 在大多数架构上 成本包括将所有 或部分 或没有 寄存器保存到堆栈 将函数参数推送到堆栈 或将
  • 将 HTML 渲染为图像

    我正在基于动态输入和裁剪图像生成优惠券 并且现在使用 ntml 和 css 显示优惠券 问题是 打印这已成为一个问题 因为打印时背景如何消失以及其他问题 所以我认为最好的解决方案是能够基于html生成图像 或者设置某种接受字符串和图像的模板
  • C# 替换 Byte[] 中的字节

    替换字节数组中的某些字节的最佳方法是什么 例如我有bytesFromServer listener Receive ref groupEP 我可以做BitConverter ToString bytesFromServer 将其转换为可读格

随机推荐