【发布时间】:2010-09-22 15:15:36
【问题描述】:
您是否必须传递 delete 与 new 返回的相同指针,或者您可以传递一个指向类基类型之一的指针?例如:
class Base
{
public:
virtual ~Base();
...
};
class IFoo
{
public:
virtual ~IFoo() {}
virtual void DoSomething() = 0;
};
class Bar : public Base, public IFoo
{
public:
virtual ~Bar();
void DoSomething();
...
};
Bar * pBar = new Bar;
IFoo * pFoo = pBar;
delete pFoo;
当然,这大大简化了。我真正想做的是创建一个充满 boost::shared_ptr 的容器,并将其传递给一些代码,该代码将在完成后将其从容器中删除。此代码对 Bar 或 Base 的实现一无所知,并将依赖 shared_ptr 析构函数中隐含的删除运算符来做正确的事情。
这可能行得通吗?我的直觉说不,因为指针不会有相同的地址。另一方面, dynamic_cast
感谢您的帮助,所有回答和评论的人。我已经知道虚拟析构函数的重要性,如我的示例所示;看到答案后,我稍微思考了一下,并意识到虚拟析构函数的全部原因就是这种情况。因此它必须工作。我被缺少将指针转换回原始指针的可见方法而感到震惊。更多的思考让我相信有一种看不见的方法,我推测析构函数正在返回真正的删除指针以释放。当我在 ~Base 中看到这一行时,调查来自 Microsoft VC++ 的编译代码证实了我的怀疑:
mov eax, DWORD PTR _this$[ebp]
跟踪汇编程序发现这是传递给删除函数的指针。谜团解开了。
我已经修复了将虚拟析构函数添加到 IFoo 的示例,这是一个简单的疏忽。再次感谢所有指出这一点的人。
【问题讨论】:
标签: c++ boost polymorphism