跨模块中的分配内存问题

现在有dll模块A,dll模块B以及静态库C,

C中有个全局Create()函数负责创建对象M,当第二次调用Create()的时候会增加引用计数,并返回原来创建的对象M。Relase()会减少引用计数。当引用计数为0时,销毁对象M。现在在模块A中创建的初始化对象M,模块B继续调用Create(),出现在模块B中得到的对象并不是模块A所创建的对象M。想简单的通过将模块A中创建的对象M传给模块B解决问题,但在卸载A,B模块的时候会出现释放空指针的问题

 

 

 

 

 

具体跟踪:

当在模块A中使用静态库Create()创建对象M,在模块A中其他地方也这样使用Create(),引用计数如预料中增加,即调用两次,引用计数增加至2,并返回已经创建好的M。

但接下来,在模块B中使用静态库Create()创建对象M,会出现引用计数重新开始计数,也就是说新创建了另外个对象。

 

 

 

 

原因就是因为跨模块,此时的全局函数只能相对于模块全局。

进一步讲就是,当在模块A中引用计数这个变量,对象M的指针,以及指针所指向的内存都是在A中的heap中分配的,

而在模块B中,它们的内存却在B中的heap中分配的,当然会出现创建新对象的现象

 

 

 

 

解决方法:需要将对象M的创建先于模块A,和模块B,然后在初始化模块A,模块B的时候将创建好的对象M传给它们使用,然后在模块A和模块B卸载后,释放对象M。注意这里Create()函数的引用计数已经不起作用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值