Убедитесь, что указатели, которые вы помещаете в стек, расположены динамически. Сбой следующего:
std::vector<Base*> objects;
void make_one(void)
{
Derived d;
objects.push_back(&d);
}
Потому что, когда функция завершится, класс, на который указывает &d
, будет освобожден. Это облегчается динамическим размещением объектов:
std::vector<Base*> objects;
void make_one(void)
{
Derived *d = new Derived;
objects.push_back(d); // a-ok
}
Просто не забудьте пройтись по вектору, когда закончите, и набрать delete
для них:
struct deleter
{
template <typename T>
void operator()(T* pObject) const
{
delete pObject;
}
}
std::for_each(objects.begin(), objects.end(), deleter());
Если вы можете использовать boost, есть библиотека контейнеров с указателями , которая сделает это за вас. Обратите внимание, вы не можете использовать auto_ptr
и пытаться позволить ему сделать это за вас; auto_ptr
плохо работает с контейнерами.
Также убедитесь, что в ваших базовых классах есть виртуальные деструкторы:
struct base
{
virtual ~base(void) {} // important!
}
Если это не так, вызов delete
для базового класса приведет к запуску только базового конструктора, утечка любых ресурсов, которые мог иметь производный класс. Сделав его виртуальным, компилятор может перейти к нужному деструктору.