【发布时间】:2012-01-24 11:02:06
【问题描述】:
我对 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 方法的正确方法是什么?
【问题讨论】:
-
由于您是 C++ 新手,请注意以下建议:永远不要使用
new、delete或指针。作为一个例外,您可以在智能指针的构造函数中使用new,但前提是您确定确实需要动态存储。 -
Kerrek 忘了推荐a good introductory C++ book :)
-
在OO中你不需要setter,你需要让对象做某事的函数(离婚,再婚)。 Setter 可能很方便,但它们不是 obv。
-
您必须问自己的问题是:“
Person是否拥有他的Wife?”和“当Person的生命周期结束时,他的Wife是否应该被自动销毁?”。 -
下意识地呼唤“智能指针”的任何答案的问题在于他们没有抓住重点——设计过程中的第一个问题不应该是如何实现动态存储,但是否需要动态存储。这是我认为 Java 和任何“现代 OO”负责的最大罪行之一:它完全削弱了人们思考其数据的底层 逻辑结构 的能力。 首先您考虑生命周期,然后才继续实现所需的语义。
标签: c++ memory memory-management memory-leaks