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&
设置不允许。临时对象在构造函数表达式的末尾消失。