假设我创建了一个名为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
现在包含一个与某个临时内存位置相关联的引用变量吗?基本上与参考变量相关联的变量现在已经“死亡”,参考变量会发生什么?
此外,这是一个我希望我的类有一个接受右值引用的构造函数的情况吗?
答案 0 :(得分:2)
为什么我的代码能够编译?
仅仅因为您的代码编译,并不意味着它将正常工作。否则,世界上的每个程序都会自动无错误,因为它成功地通过了编译阶段,并且任何人都不需要学习如何使用调试器。
显然,事情并非如此。
不管my_class现在包含一个关联的引用变量 有一些临时记忆位置?
是的,确实如此。
基本上是引用变量所在的变量 现在已经“死了”,这个参考会发生什么 变量?
您的参考变量没有任何变化。它仍然存在。但引用该对象 - 这意味着尝试调用其方法或访问其成员 - results in undefined behavior。
答案 1 :(得分:0)
如果getMyResource()返回一个MyResource对象,则在getMyresource()中的某个位置为对象分配内存(可能在堆上),因此您必须释放已分配的内存。例如,在MyClass析构函数中为m_my_resource调用MyResource析构函数。如果你不打算在程序中发生内存泄漏。在C ++中没有垃圾收集器来释放自动分配的内存,你必须自己完成,但是如果内存泄漏是一个问题,那么就没有明显的问题编译,只是执行。