C++,在基类上调用delete会导致?

use*_*091 1 c++ inheritance

我有两个与C++中的代码相关的问题:

class Base
{
public:
    virtual bool deleteMe()
    { 
        delete this;
        return true;
    }
};

class Derived: public Base
{
public:
    void setBCO(const BigCustomObject& t_BCO)
    { m_BCO=t_BCO;}

    BigCustomObject m_BCO;
};


int main()
{
    Derived *pDerived = new Derived();

    //insertint the "BigCustomObject" by new or local copy makes no difference, or?
    //Because the "setBCO(){m_BCO=t_BCO;}" calls the copy operator anyway, or?
    pDerived->setBCO( ... );

    bool checkDel = pDerived->deleteMe();

    //bool checkDel = ((Base*)pDerived)->deleteMe(); //Does this make any difference?
    std::cout<<checkDel;
}
Run Code Online (Sandbox Code Playgroud)

1.)deleteMe()函数在删除自己的对象后返回一个值怎么可能?

2.)当只删除基础对象时,派生对象中的"BigCustomObject"会发生什么?

谢谢.

Rei*_*ica 6

  1. 代码执行的对象仅用作this指针(以及非限定成员名称的隐式容器).它与可执行代码本身没有任何关系,因此执行可以继续正常.但是,如果deleteMe()尝试访问this删除后的任何数据成员,它就会遇到麻烦.

  2. 在你的情况下,它可能泄露.从技术上讲,代码具有未定义的行为,因此任何事情都可能发生.原因是Base没有虚拟析构函数,因此通过指向基类的指针删除派生对象是未定义的.Base但是,如果有一个虚拟析构函数,它将工作得很好 - Derived将调用析构函数(通过虚拟调度),然后调用析构函数BigCustomObject来销毁m_BCO然后调用析构函数Base.