Правило пяти
Если классу нужен собственный деструктор, то почти наверняка нужны и собственный конструктор копирования, оператор присваивания и — начиная с C++11 — перемещающие конструктор и присваивание.
Логика простая: нужда хотя бы в одной из этих функций означает, что класс управляет ресурсом, а автоматически сгенерированные компилятором остальные будут делать не то — поверхностно копировать указатель, так что два объекта считают, что владеют одной памятью, и освобождают её дважды. Изначально это было правило трёх: деструктор, конструктор копирования и присваивание. C++11 добавил две операции перемещения, а с ними неприятную ловушку: одно лишь объявление деструктора подавляет неявное создание перемещающих операций. Класс, написанный по старому правилу трёх, молча получает копирование там, где нужно перемещение — корректно, но заметно медленнее, и заметить это легко не получится.