C++ 删除 base 或 dynamic_cast 指针?

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

在我们有一个派生类对象绑定(bind)到基类指针的情况下 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。如果析构函数不是虚拟的,则需要删除使用 new 创建的对象的确切指针类型。

关于C++ 删除 base 或 dynamic_cast 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55015189/

相关文章:

c# - 消除 C# 代码中过多的空格和新行

c++ - OpenCV 2.4.7 GPL 许可问题与 mser.cpp

c++ - 唯一指针映射,带有原始指针的 .at()

C指针地址很奇怪

C++从指针调用成员函数在引入参数时调用内存访问冲突

指针代码

java - 我将如何着手制作高效的键值存储(例如内存缓存)/简单数据库?

C++ 在函数中返回错误的 boolean 值

azure-web-roles - VS 2015 中缺少 Web 角色和工作角色模板

visual-studio - 如何在 Visual Studio 中查看线程窗口?