C 删除base或Dynamic_cast指针

C++ delete base or dynamic_cast pointer?

本文关键字:cast 指针 Dynamic 删除 base      更新时间:2023-10-16

在我们将派生的类对象绑定到基类指针bPtr的情况下,而派生的类指针dPtr通过dynamic_cast<D*>指向同一对象,什么是清理的正确方法资源?

class B {
public:
    B() { cout << "B_ctor" << endl; }
    virtual ~B() { cout << "B_destructor" << endl; }
    virtual void foo() { cout << "B_foo()" << endl; }
};
class D : public B {
public:
    D() { cout << "D_ctor" << endl; }
    ~D() { cout << "D_destructor" << endl; }
    void foo() { cout << "D_foo()" << endl; }
};   
int main() 
{ 
    B * bPtr = new D;
    D * dPtr = dynamic_cast<D*>(bPtr);
    bPtr->foo();
    dPtr->foo();
    //delete bPtr;
    delete dPtr;
}

我选择删除dPtr。我也可以选择bPtr。每当我执行VS2015编译器时,每当会闪烁错误。所以我的问题是处理给定情况的标准方法是什么?

另外,每当我将代码更改为

D d;
B * bPtr = &d;
D * dPtr = dynamic_cast<D*>(bPtr);

我无法删除指针。该计划只是中断。为什么?

您对一个对象有两个指针。如果用new创建对象,则必须使用delete销毁它。如果不是,则与第二个示例一样,使用delete是错误。

由于只有一个new,您应该完全有一个delete来销毁它。您使用哪个指针无关紧要,因为它们是彼此的副本,并且驱动器被声明为virtual。如果destructor不是虚拟的,则需要删除使用new创建的对象的确切指针类型。

D d定义了自动分配的变量。当它超出范围时,它会自动处置。您不需要delete,并且由于未分配new,您不能delete

delete您的newdelete[]您的new []。如果您没有这样做,则不要delete。如果您没有分配变量,请检查文档中提供了提供变量以查看如何正确处理它的函数。

其他有用的阅读:为什么术语"自动"并"动态"优先于"堆栈"一词。和"堆"在C 内存管理中?