【c++手记】句柄类智能指针
生活随笔
收集整理的這篇文章主要介紹了
【c++手记】句柄类智能指针
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
很多同學(xué)學(xué)習(xí)c++都會看的一本經(jīng)典教材《Primer》 而在面向?qū)ο罄锩嫣峒暗揭环N概念-智能指針,而往往同學(xué)會出現(xiàn)以下的問題 【問題】 智能指針是不是一種指針? stl里面的智能指針是什么? 【回答】 智能指針是一種類,別名稱為句柄類。而這種類型恰恰是《設(shè)計(jì)模式》中的代理模式、適配器模式(這兩種模式以后會在MyBlog的相關(guān)文章介紹)。 stl里面的智能指針同樣也不是指針!是一種類型! (請往下看!)
以下為Baidu解釋 ? 【定義】 句柄類(智能指針smart point)是存儲指向動態(tài)分配(堆)對象指針的類。除了能夠在適當(dāng)?shù)臅r(shí)間自動刪除指向的對象外,他們的工作機(jī)制很像C++的內(nèi)置指針。智能指針在面對異常的時(shí)候格外有用,因?yàn)樗麄兡軌虼_保正確的銷毀動態(tài)分配的對象。他們也可以用于跟蹤被多用戶共享的動態(tài)分配對象。 在C++中一個(gè)通用的技術(shù)是定義包裝(cover)類或句柄(handle)類,也稱智能指針。句柄類存儲和管理基類指針。指針?biāo)赶驅(qū)ο蟮念愋涂梢宰兓?#xff0c;它既可以指向基類類型對象又可以指向派生類型對象。用戶通過句柄類訪問繼承層次的操作(指針的對應(yīng)的類型的操作)。因?yàn)榫浔愂褂弥羔槇?zhí)行操作,虛成員的行為將在運(yùn)行時(shí)根據(jù)句柄實(shí)際綁定的對象類型而變化,即實(shí)現(xiàn)c++運(yùn)行時(shí)動態(tài)綁定。故句柄用戶可以獲得動態(tài)行為但無需操心指針的管理。 【使用的相關(guān)技術(shù)】 1、引入使用計(jì)數(shù) 定義句柄類或智能指針的通用技術(shù)是采用一個(gè)使用計(jì)數(shù)(use count)。句柄類將一個(gè)計(jì)數(shù)器與類指向的對象相關(guān)聯(lián)。使用計(jì)數(shù)跟蹤該類有多少個(gè)指針共享同一對象。當(dāng)使用計(jì)數(shù)為0時(shí),就刪除該類對象,否則再刪除類對象時(shí),只要引用計(jì)數(shù)不為0,就不刪除實(shí)際的類對象,而是是引用計(jì)數(shù)減1,實(shí)現(xiàn)虛刪除。 2、使用計(jì)數(shù)類
為了便于理解,我們定義一個(gè)實(shí)際類(Point),一個(gè)引用計(jì)數(shù)器類(UPoint),一個(gè)句柄類(Handle),后面將有例子給以參考。 實(shí)現(xiàn)使用計(jì)數(shù)有兩種經(jīng)典策略:一種是定義一個(gè)單獨(dú)的具體的類用以封裝使用計(jì)數(shù)和指向?qū)嶋H類的指針; 另一種是定義一個(gè)單獨(dú)的具體的類用以封裝引用計(jì)數(shù)和類的對象成員。我們稱這種類為計(jì)數(shù)器類(UPoint)。在計(jì)數(shù)器類中,所有成員均設(shè)置為private,避免外部訪問,但是將句柄類Handle類聲明為自己的友元,從而使句柄類能操縱引用計(jì)數(shù)器。 3、寫時(shí)復(fù)制
寫時(shí)復(fù)制(copy on write)技術(shù)是解決如何保證要改動的那個(gè)引用計(jì)數(shù)器類UPoint對象不能同時(shí)被任何其他的句柄類(Handle類)所引用。通俗的來說,就是當(dāng)實(shí)際對象Point被多個(gè)Handle類的指針共享時(shí),如果需要通過指針改變實(shí)際對象Point,而其他的指針又需要保持原來的值時(shí),這就有矛盾了。打個(gè)不恰當(dāng)?shù)谋确絹碚f,兩個(gè)以上的人共有5W塊錢,如果其中一個(gè)人想用這5W塊錢去消費(fèi),那就必須通知其他人。否則在這個(gè)人消費(fèi)了5塊錢后,其他人還以為他們?nèi)匀挥?W塊錢,如果這兒時(shí)候,他們?nèi)ベI5W的東西,就會發(fā)現(xiàn)錢變少了或是沒有了,此時(shí)他們就陷入債務(wù)的泥團(tuán)。在C++中通過指針訪問已經(jīng)刪除或是不存在的對象,將是非常危險(xiǎn)的。有可能系統(tǒng)提示該行為未定義,也有可以內(nèi)存非法訪問,還有可能使系統(tǒng)崩潰。
【目的】 http://cmdblock.blog.51cto.com/415170/116075 【評論】 本人覺得句柄類這個(gè)概念有點(diǎn)類似于“適配器模式”“代理模式”,其目的皆是為了隱藏真正的類型。而且通過句柄類來控制,在涉及到大型、復(fù)雜對象以及一些不能復(fù)制或是不易復(fù)制的對象的復(fù)制控制問題時(shí),顯得特別有用。
《c++primer》P502 (待續(xù)!)
以下為Baidu解釋 ? 【定義】 句柄類(智能指針smart point)是存儲指向動態(tài)分配(堆)對象指針的類。除了能夠在適當(dāng)?shù)臅r(shí)間自動刪除指向的對象外,他們的工作機(jī)制很像C++的內(nèi)置指針。智能指針在面對異常的時(shí)候格外有用,因?yàn)樗麄兡軌虼_保正確的銷毀動態(tài)分配的對象。他們也可以用于跟蹤被多用戶共享的動態(tài)分配對象。 在C++中一個(gè)通用的技術(shù)是定義包裝(cover)類或句柄(handle)類,也稱智能指針。句柄類存儲和管理基類指針。指針?biāo)赶驅(qū)ο蟮念愋涂梢宰兓?#xff0c;它既可以指向基類類型對象又可以指向派生類型對象。用戶通過句柄類訪問繼承層次的操作(指針的對應(yīng)的類型的操作)。因?yàn)榫浔愂褂弥羔槇?zhí)行操作,虛成員的行為將在運(yùn)行時(shí)根據(jù)句柄實(shí)際綁定的對象類型而變化,即實(shí)現(xiàn)c++運(yùn)行時(shí)動態(tài)綁定。故句柄用戶可以獲得動態(tài)行為但無需操心指針的管理。 【使用的相關(guān)技術(shù)】 1、引入使用計(jì)數(shù) 定義句柄類或智能指針的通用技術(shù)是采用一個(gè)使用計(jì)數(shù)(use count)。句柄類將一個(gè)計(jì)數(shù)器與類指向的對象相關(guān)聯(lián)。使用計(jì)數(shù)跟蹤該類有多少個(gè)指針共享同一對象。當(dāng)使用計(jì)數(shù)為0時(shí),就刪除該類對象,否則再刪除類對象時(shí),只要引用計(jì)數(shù)不為0,就不刪除實(shí)際的類對象,而是是引用計(jì)數(shù)減1,實(shí)現(xiàn)虛刪除。 2、使用計(jì)數(shù)類
為了便于理解,我們定義一個(gè)實(shí)際類(Point),一個(gè)引用計(jì)數(shù)器類(UPoint),一個(gè)句柄類(Handle),后面將有例子給以參考。 實(shí)現(xiàn)使用計(jì)數(shù)有兩種經(jīng)典策略:一種是定義一個(gè)單獨(dú)的具體的類用以封裝使用計(jì)數(shù)和指向?qū)嶋H類的指針; 另一種是定義一個(gè)單獨(dú)的具體的類用以封裝引用計(jì)數(shù)和類的對象成員。我們稱這種類為計(jì)數(shù)器類(UPoint)。在計(jì)數(shù)器類中,所有成員均設(shè)置為private,避免外部訪問,但是將句柄類Handle類聲明為自己的友元,從而使句柄類能操縱引用計(jì)數(shù)器。 3、寫時(shí)復(fù)制
寫時(shí)復(fù)制(copy on write)技術(shù)是解決如何保證要改動的那個(gè)引用計(jì)數(shù)器類UPoint對象不能同時(shí)被任何其他的句柄類(Handle類)所引用。通俗的來說,就是當(dāng)實(shí)際對象Point被多個(gè)Handle類的指針共享時(shí),如果需要通過指針改變實(shí)際對象Point,而其他的指針又需要保持原來的值時(shí),這就有矛盾了。打個(gè)不恰當(dāng)?shù)谋确絹碚f,兩個(gè)以上的人共有5W塊錢,如果其中一個(gè)人想用這5W塊錢去消費(fèi),那就必須通知其他人。否則在這個(gè)人消費(fèi)了5塊錢后,其他人還以為他們?nèi)匀挥?W塊錢,如果這兒時(shí)候,他們?nèi)ベI5W的東西,就會發(fā)現(xiàn)錢變少了或是沒有了,此時(shí)他們就陷入債務(wù)的泥團(tuán)。在C++中通過指針訪問已經(jīng)刪除或是不存在的對象,將是非常危險(xiǎn)的。有可能系統(tǒng)提示該行為未定義,也有可以內(nèi)存非法訪問,還有可能使系統(tǒng)崩潰。
【目的】 http://cmdblock.blog.51cto.com/415170/116075 【評論】 本人覺得句柄類這個(gè)概念有點(diǎn)類似于“適配器模式”“代理模式”,其目的皆是為了隱藏真正的類型。而且通過句柄類來控制,在涉及到大型、復(fù)雜對象以及一些不能復(fù)制或是不易復(fù)制的對象的復(fù)制控制問題時(shí),顯得特別有用。
《c++primer》P502 (待續(xù)!)
轉(zhuǎn)載于:https://www.cnblogs.com/jstone/archive/2012/08/30/2664358.html
總結(jié)
以上是生活随笔為你收集整理的【c++手记】句柄类智能指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收藏开发人员常去网站
- 下一篇: c/c++头文件函数一览表