在我们有一个派生类对象绑定(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/