Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 引用变量的引用';模具';?_C++_Lvalue_Rvalue_Temporary Objects - Fatal编程技术网

C++ 引用变量的引用';模具';?

C++ 引用变量的引用';模具';?,c++,lvalue,rvalue,temporary-objects,C++,Lvalue,Rvalue,Temporary Objects,假设我创建了一个名为MyClass的类,其中包含一个引用变量m_my_resource。此引用变量本质上只是与其他内存位置关联的命名别名 我的班级 class MyClass { public: MyClass(const MyResource& my_resource) : m_my_resource(my_resource){} private: const MyResource& m_my_r

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

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

如果getMyResource()返回一个MyResource对象,那么在getMyResource()中的某个地方您正在为该对象分配内存(可能在堆上),因此您必须释放分配的内存。例如,在MyClass析构函数中为m_my_资源调用MyResource析构函数。如果你不这样做,你的程序就会有内存泄漏。在C++中没有垃圾回收器自动释放分配的内存,你必须自己做,但是如果内存泄漏是个问题,就有不明显的问题编译,只是执行。 为什么我的代码能够编译

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

显然,事情不是这样的

我的_类现在不包含关联的引用变量吗 用一些临时内存位置

是的

基本上是引用变量所在的变量 与现在已“死亡”的关联,引用发生了什么 变量


引用变量没有任何变化。它仍然存在。但是引用对象——它意味着试图调用它的方法或访问它的成员——

相关/ DUPE:可能更具体,但也有前者的缺点:“为什么我的代码能够编译?”很多错误的C++代码仍然编译。最后但并非最不重要的一点,请每个问题回答一个问题。@BaummitAugen您链接到的问题对我来说很难理解。
MyClass
的实例是否可能拥有此临时对象的所有权?当前的
const&
设置不允许。临时对象在构造函数表达式的末尾消失。