Безопасно ли инициализировать auto_ptr указателем на производный класс?

Допустим, у меня есть базовый класс и производный класс:

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());

правильно вызвать деструктор производного класса вместо базового класса без утечки памяти?

3

Решение

Несмотря на то, что вы не должны использовать std::auto_ptr больше с момента появления C ++ 11;

Да это безопасно пока ваша база имеет виртуальный деструктор.

Без виртуального деструктора на базе, (вроде Стив Джессоп отмечено ниже), вы получите неопределенное поведение, поскольку деструктор производного класса будет неизвестен во время уничтожения и, следовательно, не будет выполнен. Это опасная проблема, поскольку во многих случаях она остается незамеченной. Например, если бы вы управляли каким-либо ресурсом в классе с одним наследованием, который должен был быть освобожден в деструкторе, утечка произошла бы тихо.

5

Другие решения

Совершенно безопасно.

Доступно много ссылок — попробуйте поискать «полиморфизм auto_ptr».

например http://www.devx.com/tips/Tip/14391

1

Пока ваш класс Base std::auto_ptr<Base> параметризован с имеет virtual деструктор вы можете инициализировать std::auto_ptr<Base> с классами, производными от Base и они будут должным образом уничтожены, если std::auto_ptr<Base> деструктор создается, когда определение Base виден

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector