Только Foobar
требуется пользовательский конструктор копирования, оператор присваивания и деструктор. Foobase
не нужен, потому что поведение компилятора по умолчанию достаточно хорошее.
В случае Foobar
у вас есть утечка в операторе присваивания. Вы можете легко исправить это, освободив объект перед его выделением, и этого должно быть достаточно. Но если вы когда-нибудь добавите второй элемент указателя к Foobar
, вы увидите, что тогда все становится сложнее. Теперь, если у вас есть исключение при выделении второго указателя, вам нужно правильно очистить первый выделенный указатель, чтобы избежать повреждения или утечек. И все становится сложнее, чем полиномиальным образом, когда вы добавляете больше указателей.
Вместо этого вы хотите реализовать оператор присваивания в терминах конструктора копирования. Затем вы должны реализовать конструктор копирования в терминах не-бросающей функции подкачки. Подробнее читайте об идиоме «Копировать и поменять».
Кроме того, конструктор по умолчанию Foobar
не инициализирует элементы по умолчанию. Это плохо, потому что это не то, чего ожидает пользователь. Указатель члена указывает на произвольный адрес, а int имеет произвольное значение. Теперь, если вы используете объект, созданный конструктором, вы окажетесь очень близко от Земли неопределенного поведения.