Еще раз повторяю — я не ваш студент. Простых и правильных способов нет по простой причине — задачи, цели и ситуации бывают разные. Навязывать свое мнение другому человеку, когда вас об этом не просят — плохая привычка.
Да, я знаю реальные примеры, когда такое поведение приводит к проблемам.К сожалению — я не могу выложить код, так как в нем 4 миллиона строк и это военная тайна, без шуток.
В общих чертах проблемы возникают в ситуациях, вроде:
A a_val { a2 (f(x) + f(y) a1) — a3a4};
И эта проблема появляется именно из-за пропуска конструктора копирования/перемещения, тк при создании локального объекта происходит обращение к ядру распределенной системы.
Деструкторы объектов m2 и m3 вызываются уже при выходе из main(). А вот что действительно вызывает вопрос: почему в вашем выводе не присутствует вывода из этих деструкторов. Корректный результат, который получаю я, должен выглядеть так:
Деструкторы вызываются при выходе из программы. У меня выхода из программы нет, возможно вы не заметили Sleep(-1).
Если вы получаете результат, это не значит, что он корректный.
Я не забыл вернуть значение. &operator= описан для галочки, чтобы увидеть, вызывается ли он вообще, пусть и сам для себя. Возможно вы не заметили, что он не вызывается.
Вообще-то в этом случае есть copy elision.
Деструкторы объектов m2 и m3 вызываются уже при выходе из main().
Вызов деструкторов m2 и m3 не имеет ни малейшего отношения к рассматриваемой ситуации. В моем примере вызов деструкторов этих объектов не происходит по той простой причине, что программа "навечно" засыпает при вызове Sleep(-1);
Не забыл, а упустил из вида при написании статьи в 2 часа ночи. Листинг тестируемой программы содержит:
if (this != &obj)
{...}
return *this;
Но дело совсем не в этом недочете листинга. Сам оператор присваивания и не вызывается в программе. Зачаточная версия &operator= присутствует в упрощенном виде, чтобы показать, что оператор = вообще не вызывается. Исправил.
В общих чертах проблемы возникают в ситуациях, вроде:
A a_val { a2 (f(x) + f(y) a1) — a3a4};
И эта проблема появляется именно из-за пропуска конструктора копирования/перемещения, тк при создании локального объекта происходит обращение к ядру распределенной системы.
Деструкторы вызываются при выходе из программы. У меня выхода из программы нет, возможно вы не заметили Sleep(-1).
Если вы получаете результат, это не значит, что он корректный.
Я не забыл вернуть значение. &operator= описан для галочки, чтобы увидеть, вызывается ли он вообще, пусть и сам для себя. Возможно вы не заметили, что он не вызывается.
Вообще-то в этом случае есть copy elision.
Вызов деструкторов m2 и m3 не имеет ни малейшего отношения к рассматриваемой ситуации. В моем примере вызов деструкторов этих объектов не происходит по той простой причине, что программа "навечно" засыпает при вызове Sleep(-1);
Но дело совсем не в этом недочете листинга. Сам оператор присваивания и не вызывается в программе. Зачаточная версия &operator= присутствует в упрощенном виде, чтобы показать, что оператор = вообще не вызывается. Исправил.
if (this != &obj)
{
…
}
return *this;
Исправлю, как приду с работы.