我对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中可能很有意义
功能)。

08-27 09:02