Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;_C++_Oop_Memory Management_New Operator - Fatal编程技术网

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
};