C ++删除基本指针还是dynamic_cast指针?

时间:2019-03-06 03:42:40

标签: c++ pointers visual-studio-2015 polymorphism dynamic-cast

在一种情况下,我们有一个派生类对象绑定到基类指针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);

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

2 个答案:

答案 0 :(得分:4)

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?

答案 1 :(得分:4)

您有两个指向单个对象的指针。如果对象是用new创建的,则必须用delete销毁它。如果不是这样(如您的第二个示例所示),则使用delete是错误的。

由于只有一个new,因此您应该只有一个delete才能销毁它。使用哪个指针都无所谓,因为它们是彼此的副本,并且析构函数被声明为virtual。如果析构函数不是虚拟的,则需要删除使用new创建的对象的确切指针类型。