【问题标题】:Does Object Modification Create a New Object?对象修改会创建新对象吗?
【发布时间】:2014-08-03 12:35:12
【问题描述】:

我对 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);
}

【问题讨论】:

  • “然后我修改对象,并将指针指向生成的对象(第 3 行)。” -- 不,第 3 行没有这样做。在第 3 行中,您取消引用指针,这意味着您正在调用对象的赋值运算符。指针指向完全​​相同的位置。

标签: c++ oop object delete-operator


【解决方案1】:

第 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 语句正确地释放了它。

【讨论】:

  • 谢谢!这就是我一直在寻找的答案!
【解决方案2】:

忽略语法错误。 . .

您的 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 行的赋值进行了修改。

【讨论】:

  • 对不起,这不是最好的例子,实际上 ModifyObject() 在计算新的 a 和 b 时会考虑对象拥有的一些现有变量(而不是仅仅将它们设置为 z)。为了简单起见,我只是以这种方式制作了示例。感谢您的帮助!
  • 那么你正在做的是使用对象创建一个新对象并覆盖自己。您通常会做的是使用 void ModifyObject 并更改那里的任何内容。不要创建新对象,之后也不要进行分配。
  • 哇,不知道为什么我以前没有想到这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
相关资源
最近更新 更多