参考参数寿命

时间:2011-02-01 14:53:29

标签: 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.myMethod(p);
}

在对象p的生命周期结束时_myPrivate会发生什么? 编辑:我仍然可以使用_myPrivate访问对象p的副本吗?

谢谢!

4 个答案:

答案 0 :(得分:7)

由于_myPrivate 不是引用,因此在作业_myPrivate = param中,其值将从引用param指向的任何内容中复制,这种情况是p中的局部变量some_function()

所以如果ParamClass的赋值运算符正确实现,代码应该没问题。

  

我仍然可以使用_myPrivate来访问对象p的副本吗?

有了上述警告,是的。但准确地说,_myPrivate不能用于访问 p的副本; 一个变量,其中包含(现已灭绝)p中的数据副本。

答案 1 :(得分:0)

myMethod中,您调用ParamClass的赋值运算符,默认情况下会生成对象的按位副本(您可以定义自己的运算符)。所以你创建了一个p的副本,可以访问

答案 2 :(得分:0)

引用就像是对象的别名。该引用没有自己的生命周期。要考虑的生命周期是引用对象的生命周期。

在您的示例中,_myPrivate是一个对象,因此operator =将复制引用传递的objet p。 p将被销毁,参数引用将不引用任何内容,但_myPrivate,作为副本将是正常的。

如果将_myPrivate声明为:

,那将是一个问题
ParamObject& _myPrivate;

在这种情况下,您最终会得到一个“悬空”引用:未定义的行为:)

MY2C

答案 3 :(得分:0)

看看:

_myPrivate = param;

在此语句中,赋值运算符(ParamClass::operator=)将param引用的对象的每个成员的值复制到_myPrivate的成员中。当some_function返回时,p从堆栈中移出 - 它会消失。但是_myPrivate现在包含p成员值的副本。

如果ParamClass的成员指向动态分配的内存,则必须确保ParamClass::operator=执行深层复制,否则您可能会遇到悬挂指针的问题 - { {1}}析构函数可能会释放内存,但ParamClass会有一个仍然指向它的成员!