日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

跨模块中的分配内存问题

發布時間:2024/7/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跨模块中的分配内存问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在有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()函數的引用計數已經不起作用了。

總結

以上是生活随笔為你收集整理的跨模块中的分配内存问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。