c++中的New、delete和子类

New, delete, and subclasses in C++

本文关键字:子类 delete 中的 New c++      更新时间:2023-10-16

TextItemXObject的子类。

我想弄清楚为什么下面的工作:

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

但这不是:

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

第二个示例在delete上失败,并且断言失败(_BLOCK_TYPE_IS_VALID)。

XObject *xItem = textItem;
delete xItem;

只有当 XObject有虚析构函数时,才有效。否则,delete语句将调用未定义的行为。

class XObject
{
    public:
       virtual ~XObject();
     //^^^^^^ this makes virtual destructor
};

确保XObjectvirtual析构函数,否则您的第二个代码段有未定义的行为:

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

XObject不提供虚析构函数吗?如果没有虚析构函数,则在通过基指针删除TextItem时将得到未定义的行为。