C ++中的不可变类和内存

时间:2011-05-17 00:35:33

标签: c++ class memory memory-management immutability

所以,作为我正在研究的个人项目的一部分,我正在深入学习C ++,而不是在学校。我是一名Java开发人员,因此内存管理有点难以再次习惯,而现在我正在以某种方式编写代码,我有一个关于不可变类的快速问题。

当我将它们视为一个概念时,我当然将它们与Java中的Strings进行比较。但是现在我在C ++中,重新分配操作可能会造成内存泄漏(至少,我认为它可以)。所以现在如果我这样做:

  MyImmutableClass a ("blah");
  a = a.modifyInSomeWay();

其中modifyInSomeWay返回MyImmutableClass的新实例,我没有调用解构函数。我在这里缺少哪些东西可以阻止第一次分配'a'在内存中留下来?

2 个答案:

答案 0 :(得分:5)

在您描述的情况下,MyImmutableClass赋值运算符被调用以将赋值的右侧复制到左侧(覆盖左侧的任何内容)手边)。如果你的类确实是不可变的,它甚至不会拥有一个可访问的赋值运算符,并且你将得到一个编译错误。

如果你的对象是可变的,并且你有一个(正确的)赋值操作符,那么就不会有内存泄漏,因为左侧数据的析构函数将根据需要运行以释放内存。但是,编写正确的赋值运算符对某些类来说可能很棘手。

这种直接分配给(用户定义的)对象的概念在Java中不存在,因为在那里一切都是引用。

答案 1 :(得分:0)

由于其值语义,在Java中很多地方都可以找到共享不可变值对象的样式在C ++中不能很好地工作。说“对象应该是不可变的,但任务应该仍然有效”是一个矛盾。你可以使用shared_ptr<your_immutable_type>类型的变量,但这会使代码变得混乱,因此在实践中很少有人这样做。