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).
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)
确保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)