Допустим, у меня есть базовый класс и производный класс:
class Base
{
public:
virtual ~Base() {}
virtual void DoSomething() = 0;
};class Child : public Base
{
public:
virtual void DoSomething()
{
// Do Something
}
};
Безопасно ли инициализировать std :: auto_ptr типа базового класса указателем на экземпляр производного класса? И.Е. Будет ли объект создан так:
std::auto_ptr<Base> myObject(new Derived());
правильно вызвать деструктор производного класса вместо базового класса без утечки памяти?
Несмотря на то, что вы не должны использовать std::auto_ptr
больше с момента появления C ++ 11;
Да это безопасно пока ваша база имеет виртуальный деструктор.
Без виртуального деструктора на базе, (вроде Стив Джессоп отмечено ниже), вы получите неопределенное поведение, поскольку деструктор производного класса будет неизвестен во время уничтожения и, следовательно, не будет выполнен. Это опасная проблема, поскольку во многих случаях она остается незамеченной. Например, если бы вы управляли каким-либо ресурсом в классе с одним наследованием, который должен был быть освобожден в деструкторе, утечка произошла бы тихо.
Совершенно безопасно.
Доступно много ссылок — попробуйте поискать «полиморфизм auto_ptr».
например http://www.devx.com/tips/Tip/14391
Пока ваш класс Base
std::auto_ptr<Base>
параметризован с имеет virtual
деструктор вы можете инициализировать std::auto_ptr<Base>
с классами, производными от Base
и они будут должным образом уничтожены, если std::auto_ptr<Base>
деструктор создается, когда определение Base
виден