参考变量在参考变量“死亡”时会发生什么?

时间:2016-12-18 16:13:35

标签: c++ lvalue rvalue temporary-objects

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

MyClass的

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函数中,我构造了一个带有临时对象(rvalue)的MyClass实例。为什么我的代码能够编译?不是my_class现在包含一个与某个临时内存位置相关联的引用变量吗?基本上与参考变量相关联的变量现在已经“死亡”,参考变量会发生什么?

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

2 个答案:

答案 0 :(得分:2)

  

为什么我的代码能够编译?

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

显然,事情并非如此。

  

不管my_class现在包含一个关联的引用变量   有一些临时记忆位置?

是的,确实如此。

  

基本上是引用变量所在的变量   现在已经“死了”,这个参考会发生什么   变量?

您的参考变量没有任何变化。它仍然存在。但引用该对象 - 这意味着尝试调用其方法或访问其成员 - results in undefined behavior

答案 1 :(得分:0)

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