在我们有一个绑定到基类指针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
创建的对象的确切指针类型。
D d
定义了Automatically分配的变量。当它超出范围时,它会自动处理掉。你不需要delete
它,因为它没有分配new
你不能delete
它。
只有delete
你new
和delete[]
什么你new []
。如果你没有做任何一个不delete
它。如果您没有分配变量,请检查提供变量的函数的文档,以了解如何正确处理它。