Каждый класс C ++ имеет конструктор копирования , который вызывается, когда необходимо скопировать экземпляр этого класса.Аналогично, когда экземпляр назначается (как в вашем примере), вызывается оператор присваивания .
Если вы не определяете конструктор копирования или оператор присваивания явно, реализации по умолчаниюгенерируется компилятором, который просто копирует все элементы.
В этом случае это неправильное поведение, поскольку Foo
исключительно владеет указателем dynamic_int
, о чем свидетельствует тот факт, что он безоговорочно удаляет егона уничтожение.
Таким образом, вам нужно реализовать как конструктор копирования, так и оператор присваивания для обеспечения правильной семантики копирования, например:
class Foo
{
private:
int *dynamic_int;
public:
Foo ()
{
dynamic_int = new int;
}
Foo (const Foo& foo)
{
dynamic_int = new int(*foo.dynamic_int);
}
Foo &operator=(const Foo& foo)
{
delete dynamic_int;
dynamic_int = new int(*foo.dynamic_int);
}
~Foo ()
{
delete dynamic_int;
}
};
Правило для трех это хорошо иметь в виду и хорошо применяется здесь: у вас есть особое поведение уничтожения, так что, вероятно, вам также нужно настраивать поведение копирования.