当引用“死亡”时,引用变量会发生啥?
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 的引用的局部变量会发生啥