我有两个与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"会发生什么?
谢谢.
代码执行的对象仅用作this指针(以及非限定成员名称的隐式容器).它与可执行代码本身没有任何关系,因此执行可以继续正常.但是,如果deleteMe()尝试访问this删除后的任何数据成员,它就会遇到麻烦.
在你的情况下,它可能泄露.从技术上讲,代码具有未定义的行为,因此任何事情都可能发生.原因是Base没有虚拟析构函数,因此通过指向基类的指针删除派生对象是未定义的.Base但是,如果有一个虚拟析构函数,它将工作得很好 - Derived将调用析构函数(通过虚拟调度),然后调用析构函数BigCustomObject来销毁m_BCO然后调用析构函数Base.