Если вы не укажете конструктор копирования, компилятор сделает его за вас. Ваш сгенерированный компилятором конструктор копирования выглядит так:
Foo::Foo(const Foo& copy)
: my_a(copy.my_a)
{}
Woops! Вы копируете только указатель, а не указанную память. И ваш временный Foo()
в createFoo()
, и тот, что скопирован в вектор, указывают на одну и ту же память, поэтому память удаляется дважды, что приводит к сбою программы при втором удалении.
Вы должны создать конструктор копирования, который будет выглядеть примерно так:
Foo::Foo(const Foo& copy)
: my_a(new A(*copy.my_a))
{}
Обратите внимание, что это происходит сбой, если copy
имеет элемент NULL my_a
, а также вызывает конструктор копирования для A
, который вы также не указали. Итак, вы захотите внести некоторые изменения. Вам также понадобится перегрузка operator=
.