共用方式為


CFixedStringT︰自訂字串管理員範例

ATL 程式庫會實作 CFixedStringT 類別 所使用的自訂字串管理員範例,稱為 CFixedStringMgr CFixedStringT衍生自 CStringT ,並實作字串,只要字串小於 的樣板參數所指定的長度,就會將其字元資料配置為物件本身的 CFixedStringTt_nChars 一部分 CFixedStringT 使用此方法時,除非字串的長度超出固定緩衝區的大小,否則字串完全不需要堆積。 因為 CFixedStringT 不一定會使用堆積來配置其字串資料,因此無法當做字串管理員使用 CAtlStringMgr 。 它會使用自訂字串管理員 ( CFixedStringMgr ),實作 IAtlStringMgr 介面。 此介面會在實作自訂字串管理員(進階方法) 討論。

的建構函式 CFixedStringMgr 接受三個參數:

  • pData: 要使用的固定 CStringData 結構的指標。

  • nChars: 結構可以保存的最大字元 CStringData 數。

  • pMgr: 「備份字串管理員」介面的指標 IAtlStringMgr

建構函式會將 pData pMgr 的值 儲存在其各自的成員變數 ( m_pDatam_pMgr ) 中。 然後,它會將緩衝區的長度設定為零、可用的長度等於固定緩衝區的大小上限,並將參考計數設定為 -1。 參考計數值表示緩衝區已鎖定,並使用此 實例 CFixedStringMgr 做為字串管理員。

將緩衝區標示為鎖定可防止其他 CStringT 實例保留對緩衝區的共用參考。 如果允許其他 CStringT 實例共用緩衝區,則當其他字串仍在使用緩衝區時,可能會刪除 所包含的 CFixedStringT 緩衝區。

CFixedStringMgr 是介面的完整實作 IAtlStringMgr 。 每個方法的實作會分別討論。

CFixedStringMgr::Allocate 的實作

第一次實作 CFixedStringMgr::Allocate 會檢查字串的要求大小是否小於或等於固定緩衝區的大小(儲存在成員中 m_pData )。 如果固定緩衝區夠大, CFixedStringMgr 請鎖定長度為零的固定緩衝區。 只要字串長度不會成長超過固定緩衝區的大小, CStringT 就不需要重新配置緩衝區。

如果要求的字串大小大於固定緩衝區 CFixedStringMgr ,則會將要求轉送至備份字串管理員。 備份字串管理員假設要從堆積配置緩衝區。 不過,傳回這個緩衝區 CFixedStringMgr 之前,會鎖定緩衝區,並將緩衝區的字串管理員指標取代為 物件的指標 CFixedStringMgr 。 這可確保 嘗試重新配置或釋放緩衝區 CStringT ,方法會呼叫 。 CFixedStringMgr

CFixedStringMgr::ReAllocate 的實作

的實 CFixedStringMgr::ReAllocate 作與 的實作 Allocate 非常類似。

如果重新配置的緩衝區是固定緩衝區,且要求的緩衝區大小小於固定緩衝區,則不會完成配置。 不過,如果要重新配置的緩衝區不是固定緩衝區,它必須是配置給備份管理員的緩衝區。 在此情況下,備份管理員會用來重新配置緩衝區。

如果重新配置緩衝區是固定緩衝區,而且新的緩衝區大小太大而無法放入固定緩衝區內, CFixedStringMgr 請使用備份管理員配置新的緩衝區。 固定緩衝區的內容接著會複製到新的緩衝區。

CFixedStringMgr::Free 的實作

CFixedStringMgr::Free 實作會遵循 與 AllocateReAllocate 相同的模式。 如果釋放的緩衝區是固定緩衝區,方法會將它設定為長度為零的鎖定緩衝區。 如果釋放的緩衝區已與備份管理員一起配置, CFixedStringMgr 請使用備份管理員來釋放它。

CFixedStringMgr::Clone 的實作

的實作 CFixedStringMgr::Clone 一律會傳回備份管理員的指標,而不是 CFixedStringMgr 本身。 這是因為 的每個實例 CFixedStringMgr 只能與 的單一實例 CStringT 相關聯。 嘗試複製管理員的任何其他實例 CStringT 都應該改為取得備份管理員。 這是因為備份管理員支援共用。

CFixedStringMgr::GetNilString 的實作

的實作 CFixedStringMgr::GetNilString 會傳回固定緩衝區。 由於 和 CStringT 的一對一對應 CFixedStringMgr ,指定的 實例 CStringT 一次永遠不會使用多個緩衝區。 因此,永遠不需要 nil 字串和實際字串緩衝區。

每當固定緩衝區未使用時, CFixedStringMgr 請確定其初始化長度為零。 這可讓它當做 nil 字串使用。 此外, nAllocLength 固定緩衝區的成員一律會設定為固定緩衝區的完整大小。 這表示 CStringT 可以在不呼叫 IAtlStringMgr::Reallocate 的情況下成長字串,即使是 nil 字串也一樣。

需求

標頭: cstringt.h

另請參閱

使用 CStringT 管理記憶體