Неизменные классы и память в C ++ - PullRequest
2 голосов
/ 17 мая 2011

Итак, я углубляюсь в C ++, чем в школе, как часть личного проекта, над которым я работаю.Я Java-разработчик, поэтому к управлению памятью немного сложно привыкнуть, и теперь, когда я стараюсь изо всех сил писать код определенным образом, у меня есть быстрый вопрос об неизменяемых классах.

Когда я думаю о них как о концепции, я, конечно, сравниваю их со строками в Java.Но теперь, когда я нахожусь на C ++, операция переназначения может потенциально привести к утечке памяти (или, по крайней мере, я так думаю).Так что теперь, если я сделаю это:

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

, где modifyInSomeWay возвращает новый экземпляр MyImmutableClass, я не вызвал деконструктор.Есть ли что-то, чего я здесь упускаю, что помешало бы первому назначению 'a' остаться в памяти?

Ответы [ 2 ]

5 голосов
/ 17 мая 2011

В случае, который вы описали, оператор присваивания из MyImmutableClass вызывается для копирования правой части присвоения в левую часть (перезаписывая все, что было в левой части),Если ваш класс действительно неизменный, он даже не будет иметь доступный оператор присваивания, и вы получите ошибку компиляции.

Если ваш объект изменчив, а вы делаете имеет (правильный) оператор присваивания, тогда утечки памяти не будет, потому что деструкторы для данных слева будут запускаться по мере необходимости для освобождения памяти.Однако написание правильного оператора присваивания может быть сложным для некоторых классов.

Эта концепция непосредственного присваивания (пользовательскому) объекту не существует в Java, поскольку там все является ссылкой.

0 голосов
/ 17 мая 2011

Стиль совместного использования объектов с неизменяемыми значениями, который встречается во многих местах в Java, не очень хорошо работает в C ++ из-за его семантики значений. Утверждение «объект должен быть неизменным, но назначение все равно должно работать» - противоречие. Вы могли бы использовать переменные типа shared_ptr<your_immutable_type>, но это загромождает код, и, следовательно, очень немногие делают это на практике.

...