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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

靜態(tài)或者全局智能指針使用的注意幾點(diǎn)

2019-11-11 01:35:21
字體:
供稿:網(wǎng)友

靜態(tài)或者全局智能指針使用的注意幾點(diǎn)

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

一、全局化或者靜態(tài)化

全局化是指這個(gè)智能指針變量是全局的,全局的智能指針變量,會(huì)產(chǎn)生什么樣的問題呢,其實(shí)就是最擔(dān)心的重復(fù)釋放,然后引起程序的崩潰。最典型的就是如下:

std::shared_ptr<BaseFD>   Operate;

 

它可能產(chǎn)生如下幾個(gè)問題:

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

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

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

其次,如果在DLL中使用全局智能指針,就要考慮庫的卸載的先后順序,特別是在庫和庫互相調(diào)用的情況下,就需要更好的處理智能指針的控制,防止出現(xiàn)在關(guān)閉時(shí),庫已經(jīng)卸載但是全局變量才開始釋放。這個(gè)結(jié)果同樣也會(huì)產(chǎn)生崩潰的結(jié)果。

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

靜態(tài)化和此基本類似。細(xì)節(jié)上的不同不再贅述。

二、全局或靜態(tài)化的智能指針指向的是全局或者靜態(tài)內(nèi)存區(qū)。

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

Byte buf[1024] = {0};

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

三、使用棧變量的指針

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

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

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 库车县| 大丰市| 旅游| 博野县| 博野县| 惠水县| 湘潭县| 新平| 达州市| 公主岭市| 五华县| 宁化县| 辉县市| 新建县| 敖汉旗| 巴彦淖尔市| 甘孜| 通道| 贵州省| 册亨县| 布尔津县| 蒲江县| 广德县| 镇宁| 连江县| 中宁县| 定陶县| 定兴县| 娄烦县| 察隅县| 禹城市| 旌德县| 台州市| 祁阳县| 南岸区| 吴旗县| 鹿邑县| 东乡县| 丹阳市| 那曲县| 赤城县|