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

bseCls* Test()
{

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

}

最佳答案

newBse最初指向的对象将被泄漏。当您将newDrvd的地址分配给newBse时,您将丢失指向堆分配对象的指针,并且您将无法对其进行delete。在进程终止之前,该内存将不可用。

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


该对象的析构函数将在函数返回之前被调用,这意味着您将使用指向被破坏对象的指针。
为对象分配的内存位于堆栈上,并且几乎可以肯定,将来的函数调用会破坏该内存。到那时,您的指针将指向不是bseCls的东西,但是您将像使用它一样使用它。


如果使用此函数返回的指针,则表示正在调用未定义的行为,并且程序具有执行任何操作的许可。

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

10-13 07:05