我对 C++ 有点陌生,到目前为止,我一直在使用 Obj-C 和 Java 进行编程。
说,我有课:
class Person {
private:
Wife *current_wife;
//.....
};
所以 obv 我需要实现一个 setter 方法来更改 Wife 实例变量。
像这样:
Person::SetCurrentWife (Wife *new_wife) {
current_wife = new_wife;
}
那将是一个肤浅的拷贝。
所以在主循环的某个地方或我称之为:
Person *some_person = new Person();
...
Wife *wife = new Wife ();
some_person->SetCurrentWife(wife);
所以我很困惑:这里会有内存泄漏吗?我应该在此处还是在 Person 的析构函数中删除妻子对象?在 Obj-C 中,我会释放当前的妻子,然后向上面的妻子对象发送保留消息,但是在 C++ 中执行 setter 方法的正确方法是什么?
最佳答案
这取决于你想要做什么。首先,正如 Kerrek SB
评论说,如果可以使用值语义,您就不想使用指针
应用:如果 Wife
是可复制和可分配的,几乎没有理由
动态分配它。然而,在这种情况下,我猜
Wife
派生自 Person
(虽然可能是 Person
的装饰器
会更合适,因为给定的 Person
是 A
Wife
可以随时间变化),甚至可能有派生的类型
来自 Wife
(并且 Person::current_wife
可能想要持有其中一个
这些),而事实上,妻子
是有身份的;你不想要的拷贝
到处都是同一个妻子。
如果是这种情况,那么您确实必须为
其他类与 Wife
的交互。通常,使用生命周期
Wife
将不依赖于持有它的 Person
(尽管如果它是
装饰器,它可能),所以 Person
应该只持有一个指向它的指针,如
你已经完成了。 Wife
对象很可能具有各种功能
隐式或显式地控制它的生命周期:你
可能有类似的东西:
void Wife::die()
{
// ...
delete this;
}
例如。然而,在这种情况下,与 Wife
结婚的人将
必须被告知,以便 current_wife
不会指向死亡
伴侣。通常,观察者模式的一些变体可用于
这个。 (请注意,您在 Java 中遇到了完全相同的问题;您没有
想让 Person::current_wife
指向一个死掉的 Wife
。所以你还是
需要一个 Wife::die()
函数和观察者模式来通知
配偶。)
在这种情况下(根据我的经验,这种情况占绝大多数
在 C++ 中动态分配的对象),关于唯一的区别
C++ 和 Java 之间的区别在于 C++ 有一种特殊的语法来调用
“破坏者”;在 Java 中,您使用通常的函数调用
语法,你可以给函数起任何你想要的名字(虽然
dispose
似乎被广泛使用)。特殊语法允许编译器
生成额外的代码来释放内存,但所有其他的
与对象生命周期结束相关的事件仍然必须
被编程(在析构函数中,在 C++ 中——尽管在这种情况下,它
将其中一些直接放在 Wife::die
中可能是有意义的
函数)。
关于C++ : about memory management,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8576180/