Виртуальный деструктор и неопределенное поведение

Этот вопрос отличается от 'Когда/почему я должен использовать виртуальный деструктор?'.

struct B {
  virtual void foo ();
  ~B() {}  // <--- not virtual
};
struct D : B {
  virtual void foo ();
  ~D() {}
};
B *p = new D;
delete p;  // D::~D() is not called

Вопросы:

  1. Можно ли это классифицировать как неопределенное поведение (мы знаем, что ~D() не будет вызван наверняка)?
  2. Что если ~D() пуст. Это как-то повлияет на код?
  3. При использовании new[]/delete[] с B* p;, ~D() точно не будет не будет вызвана, независимо от виртуальности деструктора. Является ли это неопределенное поведение или хорошо определенное поведение?
15
задан j0k 1 July 2013 в 14:05
поделиться