gpt4 book ai didi

c++ - 基类和派生类分配

转载 作者:太空宇宙 更新时间:2023-11-04 16:22:16 27 4
gpt4 key购买 nike

在下面的代码中,drvdCls 派生自 bseCls。此代码按原样编译和运行。然而,我在这里发现了一个问题:newBse 将在 Test() 退出后被释放。我说得对吗?

bseCls* Test()
{

bseCls* newBse = new drvdCls();
drvdCls newDrvd;
newBse = &newDrvd;
return newBse;

}

最佳答案

原先由newBse指向的对象会被泄露。当您将 newDrvd 的地址分配给 newBse 时,您将丢失指向堆分配对象的指针,并且您将无法删除它。在进程终止之前,此内存将无法使用。

此外,您将堆栈分配对象的地址作为指针返回,这很糟糕,原因有二:

  1. 对象的析构函数将在函数返回之前被调用,这意味着您将使用指向已析构对象的指针。
  2. 为对象分配的内存存在于堆栈中,几乎肯定会被 future 的函数调用破坏。那时,您的指针将指向不是 bseCls 的东西,但您将像使用它一样使用它。

如果您使用此函数返回的指针,您将调用未定义的行为并且您的程序有权执行任何

关于c++ - 基类和派生类分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552557/

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