C++ : about memory management

标签 c++ memory memory-management memory-leaks

我对 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/

相关文章:

c++ - 用宏形成变量名

javascript - chrome javascript内存分析器中的系统对象是什么

c++ - 如何在 C++ 中处理可变大小的小对象的分配/释放

c# - 我应该使用静态方法还是非静态方法?

c++ - 动态捕获 CPU 和内存使用情况

c++ - 为什么这个 for 循环不停止?

c++ - 将值保存到数组中

c++ - dlclose() 没有卸载链接到 boost 的 .so 文件

海量数据的 Java HashMap/List 替代方案

c++ - 我不明白我遇到的 valgrind 错误