Оператор копирования назначения не проверяет самоназначение
Этот дефект возникает, когда не проверяется, является ли аргумент оператора назначения копирования объекта самим объектом.
Самостоятельное назначение вызывает ненужное копирование. Хотя маловероятно, что объект назначается самому себе, из-за наложения псевдонимов вы или пользователи вашего класса не всегда могут обнаружить самостоятельное назначение.
Самостоятельное назначение может привести к тонким ошибкам, если элемент данных является указателем, а память выделяется указателю динамически. В операторе присвоения копирования обычно выполняются следующие шаги:
Отмена выделения памяти, первоначально связанной с указателем.
delete ptr;
Выделение новой памяти указателю. Инициализируйте новую ячейку памяти с содержимым, полученным из аргумента оператора.
ptr = new ptrType(*(opArgument.ptr));
Если аргумент оператору, opArgument, является сам объект, после вашего первого шага, элемент данных указателя в аргументе оператора, opArgument.ptr, не связан с расположением памяти. *opArgument.ptr содержит непредсказуемые значения. Поэтому на втором шаге выполняется инициализация новой ячейки памяти с непредсказуемыми значениями.
Проверьте самоназначение в операторе присвоения копии класса. Только после тестирования выполните назначения в операторе присвоения копирования.
| Группа: Объектно-ориентированная |
| Язык: C++ |
| По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода |
Синтаксис командной строки: MISSING_SELF_ASSIGN_TEST |
| Воздействие: среднее |