gpt4 book ai didi

c++ - 跨静态库的动态内存

转载 作者:行者123 更新时间:2023-11-28 07:30:02 25 4
gpt4 key购买 nike

我有一个静态库,其中包含我的大部分代码/对象。我有另一个库继承了其中一些对象: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,这似乎有效。

问题是为什么会这样?

最佳答案

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

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

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

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

关于c++ - 跨静态库的动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17908638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com