当引用变量 'dies' 时,引用变量会发生什么?
What happens to a reference variable when its reference 'dies'?
假设我创建了一个名为 MyClass
的 class,其中包含一个引用变量 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
.
的引用(左值引用)
但是,在我的主函数中,我用一个临时对象(右值)构造了一个 MyClass
的实例。为什么我的代码能够编译? my_class
现在不包含与某个临时内存位置关联的引用变量吗?本质上,与引用变量相关联的变量现在 'died',引用变量发生了什么?
此外,在这种情况下,我希望我的 class 有一个接受右值引用的构造函数吗?
如果 getMyResource() returns 一个 MyResource 对象,在 getMyresource() 的某处你正在为对象分配内存(可能在堆上),所以你必须释放分配的内存。例如,在 MyClass 析构函数中为 m_my_resource 调用 MyResource 析构函数。如果你不这样做,你的程序就会有内存泄漏。 C++中没有垃圾收集器自动释放分配的内存,你必须自己做,但是编译没有明显的问题,只是执行,如果内存泄漏是一个问题。
Why is my code able to compile?
仅仅因为您的代码可以编译,并不意味着它可以正常工作。否则,世界上所有的程序都会自动没有错误,因为它成功通过了编译阶段,并且没有任何人需要学习如何使用调试器。
显然,事情不是这样进行的。
Doesn't my_class now contain a reference variable that is associated
with some temporary memory location?
是的,确实如此。
Essentially the variable in which the reference variable was
associated with has now 'died', what happens to the reference
variable?
您的引用变量没有任何变化。它仍然存在。但是引用对象——这意味着试图调用它的方法或访问它的成员——results in undefined behavior.
假设我创建了一个名为 MyClass
的 class,其中包含一个引用变量 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
.
但是,在我的主函数中,我用一个临时对象(右值)构造了一个 MyClass
的实例。为什么我的代码能够编译? my_class
现在不包含与某个临时内存位置关联的引用变量吗?本质上,与引用变量相关联的变量现在 'died',引用变量发生了什么?
此外,在这种情况下,我希望我的 class 有一个接受右值引用的构造函数吗?
如果 getMyResource() returns 一个 MyResource 对象,在 getMyresource() 的某处你正在为对象分配内存(可能在堆上),所以你必须释放分配的内存。例如,在 MyClass 析构函数中为 m_my_resource 调用 MyResource 析构函数。如果你不这样做,你的程序就会有内存泄漏。 C++中没有垃圾收集器自动释放分配的内存,你必须自己做,但是编译没有明显的问题,只是执行,如果内存泄漏是一个问题。
Why is my code able to compile?
仅仅因为您的代码可以编译,并不意味着它可以正常工作。否则,世界上所有的程序都会自动没有错误,因为它成功通过了编译阶段,并且没有任何人需要学习如何使用调试器。
显然,事情不是这样进行的。
Doesn't my_class now contain a reference variable that is associated with some temporary memory location?
是的,确实如此。
Essentially the variable in which the reference variable was associated with has now 'died', what happens to the reference variable?
您的引用变量没有任何变化。它仍然存在。但是引用对象——这意味着试图调用它的方法或访问它的成员——results in undefined behavior.