当引用“死亡”时,引用变量会发生啥?

Posted

技术标签:

【中文标题】当引用“死亡”时,引用变量会发生啥?【英文标题】:What happens to a reference variable when its reference 'dies'?当引用“死亡”时,引用变量会发生什么? 【发布时间】:2016-12-18 16:13:34 【问题描述】:

假设我创建了一个名为MyClass 的类,其中包含一个引用变量m_my_resource。这个引用变量本质上只是一个与其他内存位置关联的命名别名。

我的班级

class MyClass

    public:    
        MyClass(const MyResource& my_resource) :
            m_my_resource(my_resource)

    private:
        const MyResource& m_my_resource;

现在假设我尝试执行以下操作:

main

    MyClass my_class(utils::getMyResource());

    //continue doing stuff

在这种情况下究竟会发生什么?我已将MyClass 定义为只有一个构造函数,它接受对MyResource 的引用(左值引用)。

但是,在我的 main 函数中,我用一个临时对象(右值)构造了一个 MyClass 的实例。为什么我的代码能够编译? my_class 现在不包含与某个临时内存位置相关联的引用变量吗?本质上,与引用变量关联的变量现在已经“死亡”,引用变量会发生什么?

此外,在这种情况下,我是否希望我的类有一个接受右值引用的构造函数?

【问题讨论】:

相关/欺骗:***.com/questions/14735630/… 也许更具体,但前者的欺骗:***.com/questions/30519148/… 还有“为什么我的代码能够编译?” 很多 错误的 C++ 代码仍然可以编译。最后但同样重要的是,请每个问题一个问题。 @BaummitAugen 你链接到的问题我很难理解。 MyClass 的实例是否可以获取此临时对象的所有权? 不适用于您当前的const& 设置,没有。临时在构造函数表达式的末尾死亡。 【参考方案1】:

为什么我的代码可以编译?

仅仅因为您的代码可以编译,并不意味着它可以正常工作。否则,世界上的每个程序都将自动没有错误,因为它成功通过了编译阶段,并且不需要任何人学习如何使用调试器。

显然,事情并非如此。

my_class 现在不包含关联的引用变量 有一些临时内存位置吗?

是的,确实如此。

本质上是引用变量所在的变量 关联的现在已经“死亡”,引用会发生什么 变量?

您的引用变量没有任何反应。它仍然存在。但是引用对象——这意味着尝试调用它的方法或访问它的成员——results in undefined behavior。

【讨论】:

【参考方案2】:

如果 getMyResource() 返回一个 MyResource 对象,则在 getMyresource() 中的某处为该对象分配内存(可能在堆上),因此您必须释放分配的内存。例如,在 MyClass 析构函数中为 m_my_resource 调用 MyResource 析构函数。如果你不这样做,你的程序就会出现内存泄漏。在 C++ 中没有垃圾收集器来释放自动分配的内存,你必须自己做,但是编译没有明显的问题,只是执行,如果内存泄漏是一个问题。

【讨论】:

以上是关于当引用“死亡”时,引用变量会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

存储对已删除 NSManagedObject 的引用的局部变量会发生啥

在 C 中通过引用传递时会发生啥?

当我们在 C 中取消引用 NULL 指针时,操作系统会发生啥?

PHP中变量底层分析

当变量超出范围时会发生啥?

当一个 DLL 被多次链接时,导出的全局变量会发生啥?