C++ C++;
C++ C++;,c++,oop,memory-management,new-operator,C++,Oop,Memory Management,New Operator,TextItem是XObject的子类 我试图弄明白为什么以下方法有效: TextItem *textItem = new TextItem(); XObject *xItem = textItem; delete textItem; 但这并不是: TextItem *textItem = new TextItem(); XObject *xItem = textItem; delete xItem; 第二个示例在delete上失败,断言失败(\u BLOCK\u T
TextItem
是XObject
的子类
我试图弄明白为什么以下方法有效:
TextItem *textItem = new TextItem();
XObject *xItem = textItem;
delete textItem;
但这并不是:
TextItem *textItem = new TextItem();
XObject *xItem = textItem;
delete xItem;
第二个示例在
delete
上失败,断言失败(\u BLOCK\u TYPE\u是有效的)。确保XObject
有一个虚拟的析构函数,或者第二个代码段有:
确保XObject
具有virtual
析构函数,或者您的第二个代码段具有:
只有当XObject
具有虚拟析构函数时,这才有效。否则,delete
语句将调用未定义的行为
class XObject
{
public:
virtual ~XObject();
//^^^^^^ this makes virtual destructor
};
只有当XObject
具有虚拟析构函数时,这才有效。否则,delete
语句将调用未定义的行为
class XObject
{
public:
virtual ~XObject();
//^^^^^^ this makes virtual destructor
};
XObject
是否不提供虚拟析构函数?当您没有虚拟析构函数时,通过基指针删除TextItem
时,您将获得未定义的行为。是否XObject
不提供虚拟析构函数?当您没有虚拟析构函数时,通过基指针删除TextItem
时,您将获得未定义的行为。我们缺少信息。断言提示您正在删除不应该删除的内容。对象是静态的吗?你确定以前没有删除它吗?您确定您删除的指针没有将其目标更改为不应删除的对象吗?上面的代码示例已完成—仅运行这三行将可靠地再现问题。您可以看到没有删除,并且目标没有更改。对象不是静态的。然后更改编译器,因为它很糟糕。这段代码甚至不应该编译。我们缺少信息。断言提示您正在删除不应该删除的内容。对象是静态的吗?你确定以前没有删除它吗?您确定您删除的指针没有将其目标更改为不应删除的对象吗?上面的代码示例已完成—仅运行这三行将可靠地再现问题。您可以看到没有删除,并且目标没有更改。对象不是静态的。然后更改编译器,因为它很糟糕。这段代码本来就不应该编译。
class XObject
{
public:
virtual ~XObject();
//^^^^^^ this makes virtual destructor
};