gpt4 book ai didi

C++,在基类上调用 delete 结果?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:26:45 27 4
gpt4 key购买 nike

我有两个与以下 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;
}

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

2.) 当只删除基本对象时,派生对象中的“BigCustomObject”会发生什么情况?

谢谢。

最佳答案

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

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

关于C++,在基类上调用 delete 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19632576/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com