【c++手记】句柄类智能指针
生活随笔
收集整理的這篇文章主要介紹了
【c++手记】句柄类智能指针
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很多同學學習c++都會看的一本經典教材《Primer》 而在面向對象里面提及到一種概念-智能指針,而往往同學會出現以下的問題 【問題】 智能指針是不是一種指針? stl里面的智能指針是什么? 【回答】 智能指針是一種類,別名稱為句柄類。而這種類型恰恰是《設計模式》中的代理模式、適配器模式(這兩種模式以后會在MyBlog的相關文章介紹)。 stl里面的智能指針同樣也不是指針!是一種類型! (請往下看!)
以下為Baidu解釋 ? 【定義】 句柄類(智能指針smart point)是存儲指向動態分配(堆)對象指針的類。除了能夠在適當的時間自動刪除指向的對象外,他們的工作機制很像C++的內置指針。智能指針在面對異常的時候格外有用,因為他們能夠確保正確的銷毀動態分配的對象。他們也可以用于跟蹤被多用戶共享的動態分配對象。 在C++中一個通用的技術是定義包裝(cover)類或句柄(handle)類,也稱智能指針。句柄類存儲和管理基類指針。指針所指向對象的類型可以變化,它既可以指向基類類型對象又可以指向派生類型對象。用戶通過句柄類訪問繼承層次的操作(指針的對應的類型的操作)。因為句柄類使用指針執行操作,虛成員的行為將在運行時根據句柄實際綁定的對象類型而變化,即實現c++運行時動態綁定。故句柄用戶可以獲得動態行為但無需操心指針的管理。 【使用的相關技術】 1、引入使用計數 定義句柄類或智能指針的通用技術是采用一個使用計數(use count)。句柄類將一個計數器與類指向的對象相關聯。使用計數跟蹤該類有多少個指針共享同一對象。當使用計數為0時,就刪除該類對象,否則再刪除類對象時,只要引用計數不為0,就不刪除實際的類對象,而是是引用計數減1,實現虛刪除。 2、使用計數類
為了便于理解,我們定義一個實際類(Point),一個引用計數器類(UPoint),一個句柄類(Handle),后面將有例子給以參考。 實現使用計數有兩種經典策略:一種是定義一個單獨的具體的類用以封裝使用計數和指向實際類的指針; 另一種是定義一個單獨的具體的類用以封裝引用計數和類的對象成員。我們稱這種類為計數器類(UPoint)。在計數器類中,所有成員均設置為private,避免外部訪問,但是將句柄類Handle類聲明為自己的友元,從而使句柄類能操縱引用計數器。 3、寫時復制
寫時復制(copy on write)技術是解決如何保證要改動的那個引用計數器類UPoint對象不能同時被任何其他的句柄類(Handle類)所引用。通俗的來說,就是當實際對象Point被多個Handle類的指針共享時,如果需要通過指針改變實際對象Point,而其他的指針又需要保持原來的值時,這就有矛盾了。打個不恰當的比方來說,兩個以上的人共有5W塊錢,如果其中一個人想用這5W塊錢去消費,那就必須通知其他人。否則在這個人消費了5塊錢后,其他人還以為他們仍然有5W塊錢,如果這兒時候,他們去買5W的東西,就會發現錢變少了或是沒有了,此時他們就陷入債務的泥團。在C++中通過指針訪問已經刪除或是不存在的對象,將是非常危險的。有可能系統提示該行為未定義,也有可以內存非法訪問,還有可能使系統崩潰。
【目的】 http://cmdblock.blog.51cto.com/415170/116075 【評論】 本人覺得句柄類這個概念有點類似于“適配器模式”“代理模式”,其目的皆是為了隱藏真正的類型。而且通過句柄類來控制,在涉及到大型、復雜對象以及一些不能復制或是不易復制的對象的復制控制問題時,顯得特別有用。
《c++primer》P502 (待續!)
以下為Baidu解釋 ? 【定義】 句柄類(智能指針smart point)是存儲指向動態分配(堆)對象指針的類。除了能夠在適當的時間自動刪除指向的對象外,他們的工作機制很像C++的內置指針。智能指針在面對異常的時候格外有用,因為他們能夠確保正確的銷毀動態分配的對象。他們也可以用于跟蹤被多用戶共享的動態分配對象。 在C++中一個通用的技術是定義包裝(cover)類或句柄(handle)類,也稱智能指針。句柄類存儲和管理基類指針。指針所指向對象的類型可以變化,它既可以指向基類類型對象又可以指向派生類型對象。用戶通過句柄類訪問繼承層次的操作(指針的對應的類型的操作)。因為句柄類使用指針執行操作,虛成員的行為將在運行時根據句柄實際綁定的對象類型而變化,即實現c++運行時動態綁定。故句柄用戶可以獲得動態行為但無需操心指針的管理。 【使用的相關技術】 1、引入使用計數 定義句柄類或智能指針的通用技術是采用一個使用計數(use count)。句柄類將一個計數器與類指向的對象相關聯。使用計數跟蹤該類有多少個指針共享同一對象。當使用計數為0時,就刪除該類對象,否則再刪除類對象時,只要引用計數不為0,就不刪除實際的類對象,而是是引用計數減1,實現虛刪除。 2、使用計數類
為了便于理解,我們定義一個實際類(Point),一個引用計數器類(UPoint),一個句柄類(Handle),后面將有例子給以參考。 實現使用計數有兩種經典策略:一種是定義一個單獨的具體的類用以封裝使用計數和指向實際類的指針; 另一種是定義一個單獨的具體的類用以封裝引用計數和類的對象成員。我們稱這種類為計數器類(UPoint)。在計數器類中,所有成員均設置為private,避免外部訪問,但是將句柄類Handle類聲明為自己的友元,從而使句柄類能操縱引用計數器。 3、寫時復制
寫時復制(copy on write)技術是解決如何保證要改動的那個引用計數器類UPoint對象不能同時被任何其他的句柄類(Handle類)所引用。通俗的來說,就是當實際對象Point被多個Handle類的指針共享時,如果需要通過指針改變實際對象Point,而其他的指針又需要保持原來的值時,這就有矛盾了。打個不恰當的比方來說,兩個以上的人共有5W塊錢,如果其中一個人想用這5W塊錢去消費,那就必須通知其他人。否則在這個人消費了5塊錢后,其他人還以為他們仍然有5W塊錢,如果這兒時候,他們去買5W的東西,就會發現錢變少了或是沒有了,此時他們就陷入債務的泥團。在C++中通過指針訪問已經刪除或是不存在的對象,將是非常危險的。有可能系統提示該行為未定義,也有可以內存非法訪問,還有可能使系統崩潰。
【目的】 http://cmdblock.blog.51cto.com/415170/116075 【評論】 本人覺得句柄類這個概念有點類似于“適配器模式”“代理模式”,其目的皆是為了隱藏真正的類型。而且通過句柄類來控制,在涉及到大型、復雜對象以及一些不能復制或是不易復制的對象的復制控制問題時,顯得特別有用。
《c++primer》P502 (待續!)
轉載于:https://www.cnblogs.com/jstone/archive/2012/08/30/2664358.html
總結
以上是生活随笔為你收集整理的【c++手记】句柄类智能指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收藏开发人员常去网站
- 下一篇: 夜间日记