跨模块中的分配内存问题
現(xiàn)在有dll模塊A,dll模塊B以及靜態(tài)庫C,
C中有個(gè)全局Create()函數(shù)負(fù)責(zé)創(chuàng)建對象M,當(dāng)?shù)诙握{(diào)用Create()的時(shí)候會(huì)增加引用計(jì)數(shù),并返回原來創(chuàng)建的對象M。Relase()會(huì)減少引用計(jì)數(shù)。當(dāng)引用計(jì)數(shù)為0時(shí),銷毀對象M。現(xiàn)在在模塊A中創(chuàng)建的初始化對象M,模塊B繼續(xù)調(diào)用Create(),出現(xiàn)在模塊B中得到的對象并不是模塊A所創(chuàng)建的對象M。想簡單的通過將模塊A中創(chuàng)建的對象M傳給模塊B解決問題,但在卸載A,B模塊的時(shí)候會(huì)出現(xiàn)釋放空指針的問題
?
?
?
?
?
具體跟蹤:
當(dāng)在模塊A中使用靜態(tài)庫Create()創(chuàng)建對象M,在模塊A中其他地方也這樣使用Create(),引用計(jì)數(shù)如預(yù)料中增加,即調(diào)用兩次,引用計(jì)數(shù)增加至2,并返回已經(jīng)創(chuàng)建好的M。
但接下來,在模塊B中使用靜態(tài)庫Create()創(chuàng)建對象M,會(huì)出現(xiàn)引用計(jì)數(shù)重新開始計(jì)數(shù),也就是說新創(chuàng)建了另外個(gè)對象。
?
?
?
?
原因就是因?yàn)榭缒K,此時(shí)的全局函數(shù)只能相對于模塊全局。
進(jìn)一步講就是,當(dāng)在模塊A中引用計(jì)數(shù)這個(gè)變量,對象M的指針,以及指針?biāo)赶虻膬?nèi)存都是在A中的heap中分配的,
而在模塊B中,它們的內(nèi)存卻在B中的heap中分配的,當(dāng)然會(huì)出現(xiàn)創(chuàng)建新對象的現(xiàn)象。
?
?
?
?
解決方法:需要將對象M的創(chuàng)建先于模塊A,和模塊B,然后在初始化模塊A,模塊B的時(shí)候?qū)?chuàng)建好的對象M傳給它們使用,然后在模塊A和模塊B卸載后,釋放對象M。注意這里Create()函數(shù)的引用計(jì)數(shù)已經(jīng)不起作用了。
總結(jié)
以上是生活随笔為你收集整理的跨模块中的分配内存问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dockerfile拉取私库镜像_还在用
- 下一篇: PID控制器开发笔记之三:抗积分饱和PI