Does Object Modification创建一个新对象

Does Object Modification Create a New Object?

本文关键字:一个 对象 新对象 Object Modification 创建 Does      更新时间:2023-10-16

我对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行中的原始对象在第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语句正确地释放了它。

忽略语法错误…

所有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行中通过赋值修改了原始对象

相关文章: