2013-07-28 28 views
0

我有一个静态库,其中包含我的大部分代码/对象。我有另一个继承这些对象的库:E.G.动态内存跨静态库

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,而这似乎是工作的。

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

+1

你在基类中有一个虚拟析构函数吗? –

+2

好吧,使用dynamic_cast <>来代替,这就是它所要做的。破坏堆是否每天都是C++问题。 –

+0

Yochai Timmer - 我只是检查它期望它是一个虚拟析构函数,并注意到它不是。我希望以这种方式继承我的其他大部分类。这可能是原因吗?编译需要一段时间,所以会回复你。 – Rebirth

回答

1

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

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

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

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

+0

是的,这似乎是问题所在。人为错误。当我最初编写基类时,我并不期望继承它,但后来我发现我需要继承它,并忘记将该虚拟添加到析构函数中。欢呼,指引我在正确的方向。 :) – Rebirth

+0

@DyP yeap,这就是我的意思。 –