C++中的新建,删除和子类

Wat*_*oto 1 c++ oop memory-management new-operator

TextItem是.的子类XObject.

我试图弄清楚为什么以下工作:

  TextItem *textItem = new TextItem();
  XObject *xItem = textItem;
  delete textItem;
Run Code Online (Sandbox Code Playgroud)

但这不是:

  TextItem *textItem = new TextItem();
  XObject *xItem = textItem;
  delete xItem;
Run Code Online (Sandbox Code Playgroud)

第二个示例失败delete,断言失败(_BLOCK_TYPE_IS_VALID).

Naw*_*waz 7

XObject *xItem = textItem;
delete xItem;
Run Code Online (Sandbox Code Playgroud)

只有在 XObject具有虚拟析构函数时才有效.否则,该delete语句将调用未定义的行为.

class XObject
{
    public:
       virtual ~XObject();
     //^^^^^^ this makes virtual destructor
};
Run Code Online (Sandbox Code Playgroud)


GMa*_*ckG 5

确保XObject有一个virtual析构函数,或者你的第二个代码片段有未定义的行为:

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

struct TextItem : XObject {};
Run Code Online (Sandbox Code Playgroud)