C++ 参考参数寿命
鉴于以下情况:C++ 参考参数寿命,c++,object-lifetime,C++,Object Lifetime,鉴于以下情况: class ParamClass {...}; class MyObject { public: void myMethod(ParamClass const& param) { _myPrivate = param; } private: ParamClass _myPrivate; } [...] MyObject obj; void some_function(void) { ParamClass p(...); obj.m
class ParamClass {...};
class MyObject {
public:
void myMethod(ParamClass const& param) { _myPrivate = param; }
private:
ParamClass _myPrivate;
}
[...]
MyObject obj;
void some_function(void)
{
ParamClass p(...);
obj.myMethod(p);
}
在对象p的生命周期结束时_myPrivate会发生什么情况?
编辑:我仍然可以使用_myPrivate访问对象p的副本吗
谢谢
Dan由于
\u myPrivate
不是一个引用,在赋值\u myPrivate=param
中,它的值将从引用param
指向的任何对象复制过来,在这种情况下,它是某些函数()
中的局部变量p
因此,如果ParamClass
的赋值运算符实现正确,代码应该是正确的
我仍然能够使用_myPrivate访问对象p的副本吗
根据上述警告,是的。但准确地说,
\u myPrivate
不能用于访问p
的副本;它是一个变量,包含(现在已消失的)p
中的数据副本,在myMethod
中,您调用ParamClass
的赋值运算符,默认情况下,该运算符生成对象的逐位副本(您可以定义自己的运算符)。因此,您可以创建一个p的副本,该副本可以访问引用就像对象的别名。引用本身没有生存期。要考虑的生命周期是引用的对象的生命周期。
在您的示例中,_myPrivate是一个对象,因此运算符=将复制传递给objet p的引用。p将被销毁,参数引用将不引用任何内容,但是_myPrivate,作为副本就可以了
如果_myPrivate被声明为:
ParamObject& _myPrivate;
在这种情况下,您将得到一个“悬空”引用:未定义的行为:)
my2c看看:
\u myPrivate=param代码>
在此语句中,赋值运算符(ParamClass::operator=
)将param
引用的对象的每个成员的值复制到\u myPrivate
的成员中。当some_函数
返回时,p
从堆栈中移出-它消失。但是\u myPrivate
现在包含p
成员值的副本
如果ParamClass
的成员是指向动态分配内存的指针,则必须确保ParamClass::operator=
执行深度复制,否则,您可能会遇到悬空指针问题-ParamClass
的析构函数可能会释放该内存,但是\u myPrivate
将有一个成员仍然指向它 它使成员逐个复制,而不是按位复制