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