我对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);
}
答案 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行的分配修改了原始对象。