对象修改是否创建新对象?

时间:2014-06-13 03:02:10

标签: c++ oop object delete-operator

我对C ++中的对象生命周期有点困惑。我们说我有以下代码。首先,我创建指针MyObject(第1行)。然后我创建一个对象并将指针指向它(第2行)。然后我修改对象,并将指针指向结果对象(第3行)。最后,我删除了该对象,以便避免内存泄漏(第4行)。

MyClass * MyObject;
MyObject= new MyClass(x, y); 
*MyObject= MyObject-> ModifyObject(z);
delete MyObject;

第2行的原始对象是否只是在第3行修改了? (这意味着上面的代码是安全的)。或者是第3行创建的第二个对象,这意味着第2行中的第一个对象永远不会被删除,从而造成内存泄漏?

编辑:这是ModifyObject(z)可能看起来像

的样本
MyClass MyClass::ModifyObject(int z) {
    int a = z;
    int b = z;
    return MyClass(a, b);
}

2 个答案:

答案 0 :(得分:5)

  

第2行的原始对象是否只是在第3行修改了? (这意味着上面的代码是安全的)。或者是第3行中创建的第二个对象

实际上,两者都有。但这不是泄密。这一切都取决于ModifyObject

的异常实现

此代码

MyClass MyClass::ModifyObject(z) {
    int a = z;
    int b = z;
    return MyClass(a, b);
}

不会修改调用它的实例。相反,它创建一个单独的临时MyClass实例作为其返回值。 (所以函数名称确实具有误导性。)

在行*MyObject = MyObject->ModifyObject(z);中使用该函数,临时对象从ModifyObject返回。然后通过赋值运算符将其所有数据复制到*MyObject引用的原始实例。然后临时自动销毁。

之后,仍然只有一个对象通过new分配,而你的MyObject指针仍然指向它。所以delete语句正确地解除了它。

答案 1 :(得分:1)

忽略语法错误。 。 。

您的所有ModifyObject代码都在创建一个新对象并将其返回。它没有修改MyObject指向的对象。

假设你的意思

MyClass MyClass::ModifyObject(int z) {
    int a = z;
    int b = z;
    return MyClass(a, b);
}

相当于

MyClass MyClass::ModifyObject(int z) {
    return MyClass(z, z);
}

可能很容易

*MyObject = MyClass (z, z) ;

其中,如果您为MyClass定义了赋值运算符,则为该类。否则,它会执行二进制复制(通常是非常糟糕的事情)。

是的,通过第3行的分配修改了原始对象。