繁体   English   中英

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

[英]C++ delete base or dynamic_cast pointer?

在我们将派生类对象绑定到基类指针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);

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

D d定义一个自动分配的变量。 超出范围时将自动处理。 您不需要delete它,并且由于它没有分配new您无法delete它。

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

其他有用的读物​​: 为什么C ++内存管理中的术语“自动”和“动态”比术语“堆栈”和“堆”更受青睐?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM