0

我有一个静态库,其中包含我的大部分代码/对象。我有另一个库继承了其中一些对象:EG

class SomeClass <-- from base library

class AnotherSomeClass : public SomeClass <--another library

在 SomeClass 我有另一个对象 SomeObject ,它也以相同的方式继承。

SomeObject *newobject = new AnotherSomeObject(); //for example SomeObject exists in one of the base classes in another library.

然后我向上转换以访问仅存在于子类中的函数,如下所示:

AnotherSomeObject *object = (AnotherSomeObject*)newobject;

一切都运行良好,除非我释放内存,这是在基类中完成的。我得到:_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))

这只是最近才出现,很难诊断,因为在我对某些类进行一些更改之前它运行良好。

我现在删除了子类对象(它继承了基类对象),然后将基类对象设置为 NULL,这似乎可以正常工作。

问题是为什么会发生这种情况?

4

1 回答 1

1

继承时在基类中有一个虚拟析构函数很重要。

当您稍后在程序中调用 delete 时,如果您没有虚拟析构函数,编译器将生成调用属于当前变量恰好是类型的析构函数的代码。

因此,如果您持有基类类型的指针,则将使用基类析构函数。
如果您持有指向派生类类型的指针,则将使用派生类析构函数。

这可能会导致各种问题,最常见的是您可以通过查看非常难以发现的内存泄漏来发现它。

于 2013-07-28T13:32:13.033 回答