在下面的代码中,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/