Новые, удалять и подклассы в C ++ - PullRequest
1 голос
/ 16 апреля 2011

TextItem является подклассом XObject.

Я пытаюсь выяснить, почему работает следующее:

  TextItem *textItem = new TextItem();
  XObject *xItem = textItem;
  delete textItem;

Но это не так:

  TextItem *textItem = new TextItem();
  XObject *xItem = textItem;
  delete xItem;

Второй пример завершается с ошибкой delete, с ошибкой подтверждения (_BLOCK_TYPE_IS_VALID).

Ответы [ 3 ]

7 голосов
/ 16 апреля 2011
XObject *xItem = textItem;
delete xItem;

Это будет работать , только если XObject имеет виртуальный деструктор. В противном случае оператор delete вызывает неопределенное поведение.

class XObject
{
    public:
       virtual ~XObject();
     //^^^^^^ this makes virtual destructor
};
5 голосов
/ 16 апреля 2011

Убедитесь, что XObject имеет деструктор virtual, или ваш второй фрагмент имеет неопределенное поведение :

struct XObject
{
    // now deleting derived classes
    // through this base class is okay
    virtual ~XObject() {}
};

struct TextItem : XObject {};
3 голосов
/ 16 апреля 2011

Разве XObject не предоставляет виртуальный деструктор?Если у вас нет виртуального деструктора, вы получите неопределенное поведение при удалении TextItem через базовый указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...