国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

靜態或者全局智能指針使用的注意幾點

2019-11-11 02:11:00
字體:
來源:轉載
供稿:網友

靜態或者全局智能指針使用的注意幾點

在C++11普及開始后,智能指針才真正的被廣大的C++程序員使用,當然一些高手還有大牛還是非常輕視智能指針的,咱們不談那個。今天只談一談智能指針的全局化和靜態化后需要注意的幾點:

一、全局化或者靜態化

全局化是指這個智能指針變量是全局的,全局的智能指針變量,會產生什么樣的問題呢,其實就是最擔心的重復釋放,然后引起程序的崩潰。最典型的就是如下:

std::shared_ptr<BaseFD>   Operate;

 

它可能產生如下幾個問題:

首先是如果把同一個普通變量指針在不同的地方賦值給這個指針,

operate = std::shared_ptr<BaseFD> a(ptr);

必然會引起重復釋放,造成崩潰。避免的方式就是盡量不要使用這種方式分配智能指針,而是使用std::make_shared這種機制。

其次,如果在DLL中使用全局智能指針,就要考慮庫的卸載的先后順序,特別是在庫和庫互相調用的情況下,就需要更好的處理智能指針的控制,防止出現在關閉時,庫已經卸載但是全局變量才開始釋放。這個結果同樣也會產生崩潰的結果。

最后,需要處理一下全局化后在線程里的操作,防止出現半同步的現象(即計數器同步了,但是數據未同步完成,可參考智能指針多線程是否需要加鎖)。這個出現崩潰的可能性倒不是多大,但可能出現數據的不同步。

靜態化和此基本類似。細節上的不同不再贅述。

二、全局或靜態化的智能指針指向的是全局或者靜態內存區。

這個在前面遇到過,就是如果一個智能指針,其指向一個全局的數據緩沖區,在程序釋放時,智能指針會釋放一次內存,然后程序本身也會回收內存,引起退出時的崩潰。這和下面的本變量一樣。

Byte buf[1024] = {0};

std::make_shared<byte*>ptrbuf(buf);

三、使用棧變量的指針

這個和上面說過的是一樣的,如果把一局部變量或者會提前釋放的類變量取指針后傳遞給全局或者靜態的智能指針,就會由于二次釋放引起崩潰。

上面提到的這三個問題中,有些問題很明顯可以看出來,但有的就比較麻煩,比如庫里的智能指針問題,這個如果沒有一定的經驗就很難查出來。多線程使用智能指針的問題,都是需要一定的時間。

遷移到CSDN上來了,有壓力。不敢象原來天馬行空的寫了。哈哈。


上一篇:1080

下一篇:C#抽象類總結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 工布江达县| 仁怀市| 太原市| 玛曲县| 沁水县| 勃利县| 镇远县| 新化县| 海门市| 荆门市| 新和县| 九江市| 奉节县| 墨竹工卡县| 宁安市| 汝州市| 登封市| 凤阳县| 汉沽区| 玉门市| 丹寨县| 曲沃县| 合阳县| 连云港市| 苏尼特左旗| 承德市| 鲁甸县| 澳门| 新宁县| 乃东县| 龙口市| 营口市| 鸡泽县| 乌鲁木齐县| 赫章县| 周口市| 青铜峡市| 元阳县| 南投市| 青浦区| 卫辉市|