Правило трех: имеет дело со всей Большой Тройкой, но это не обязательно означает, что вам придется определять их, если вы этого не хотите.Либо вы предоставляете их, либо запрещаете их.Чего не следует делать, так это игнорировать их.
Итак, я определил только деструктор, но не конструктор копирования и оператор копирования.
Нарушаю ли я Правило трех?
Да, вы нарушаете правило.Компилятор сгенерирует конструктор копирования и оператор присваивания копии, и, поскольку вы выделяете память в конструкторе и освобождаете в деструкторе, эти копии будут иметь неверную семантику: они будут копировать указатели, и у вас будет два класса, которые будут псевдонимами в одной и той же памяти,Присвоение даже не освободит старую память и просто перезапишет указатель.
Это проблема?
Если , как выЭто означает, что вы не копируете и не присваиваете экземпляры этих классов, ничего не пойдет не так.Однако лучше быть в безопасности и объявлять (и даже не беспокоиться об определении) конструктор копирования и оператор присваивания копии как закрытые, чтобы не вызывать их случайно.
В C ++ 11вместо этого вы можете использовать синтаксис = delete
:
T(T const&) = delete; // no copy constructor
T& operator=(T const&) = delete; // no copy assignment