C++ 删除基数或 dynamic_cast 指针?

C++ delete base or dynamic_cast pointer?

在我们有一个派生的 class 对象绑定到基 class 指针 bPtr 和一个派生的 class 指针 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);

我不能删除两个指针。该程序只是中止。为什么?

D d 定义了一个 Automatically 分配变量。当它超出范围时,它会自动处理掉。您不需要 delete 它并且因为它没有分配给 new 您不能 delete 它。

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

额外的帮助阅读:Why are the terms "automatic" and "dynamic" preferred over the terms "stack" and "heap" in C++ memory management?

您有两个指向单个对象的指针。如果对象是用 new 创建的,那么你必须用 delete 销毁它。如果不是,就像在你的第二个例子中那样,那么使用 delete.

是错误的

因为只有一个 new 你应该只有一个 delete 来摧毁它。使用哪个指针并不重要,因为它们是彼此的副本并且析构函数被声明为 virtual。如果析构函数不是虚拟的,则需要删除使用 new.

创建的对象的确切指针类型