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