Ответ находится в предыдущем абзаце:
Неявно определенные специальные функции-члены обычно неверны, если класс управляет ресурсом, дескриптор которого является объектом неклассового типа (необработанный указатель , Дескриптор файла POSIX, et c), деструктор которого ничего не делает, а оператор конструктора / присваивания копирования выполняет «неглубокую копию» (копирование значения дескриптора без дублирования базового ресурса).
Правило трех говорит вам, что вы хотите, чтобы все ваши специальные члены (конструктор копирования, оператор присваивания копии и деструктор) определялись одинаково: неявно, явно или не определялись вовсе.
A Класс, который управляет некопируемым ресурсом, обычно является классом, которому принадлежит какой-то трудно копируемый ресурс. Например, std::filebuf
, который управляет файлом (используется std::fstream
). Он не определяет ни конструктор копирования, ни оператор присваивания копии: оба удаляются. Он явно определяет деструктор для закрытия файла.
Теперь, если бы деструктор оставался неявно определенным, файл никогда не закрывался бы, а буфер оставался бы в памяти, вызывая утечку памяти. Если конструктор копирования оператора присваивания копии был определен неявно, он скопировал бы указатель на буфер, а затем деструктор потенциально мог бы вызываться несколько раз для одного и того же файла, пытаясь удалить один и тот же буфер несколько раз (что является неопределенное поведение).