我对C++有点陌生,直到现在一直在用Obj-C和Java进行编程。
说,我有一个类:
class Person {
private:
Wife *current_wife;
//.....
};
因此,我需要实现一个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
是AWife
会随着时间而变化),甚至可能派生出类型
来自Wife
(而且Person::current_wife
可能想保留其中一个
这些),实际上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
似乎被广泛使用)。特殊语法允许编译器执行以下操作:生成其他代码以释放内存,但其他所有代码
与对象生命周期结束相关的 Activity 仍然必须
进行编程(在析构函数中,在C++中,尽管在这种情况下,
将其中一些直接放在
Wife::die
中可能很有意义功能)。