CFixedStringT︰自訂字串管理員範例
ATL 連結庫會實作 CFixedStringT 類別所使用的自定義字串管理員範例,稱為 CFixedStringMgr。 CFixedStringT
衍生自 CStringT,並實作字串,只要字串小於 的樣板參數所指定的長度,就會將其字元數據配置為物件本身的CFixedStringT
t_nChars
一部分CFixedStringT
。 使用此方法時,除非字串的長度超出固定緩衝區的大小,否則字串完全不需要堆積。 因為 CFixedStringT
不一定會使用堆積來配置其字串數據,因此無法當做字元串管理員使用 CAtlStringMgr
。 它會使用自定義字串管理員 (CFixedStringMgr
),實作 IAtlStringMgr 介面。 此介面會在實作自定義字串管理員(進階方法)中討論。
的建構函式 CFixedStringMgr
接受三個參數:
pData: 要使用的固定
CStringData
結構的指標。nChars: 結構可以保存的最大字元
CStringData
數。pMgr: 「備份字串管理員」介面的指標
IAtlStringMgr
。
建構函式會將 pData 和 pMgr 的值儲存在其各自的成員變數 (m_pData
和 m_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
實作會遵循 與 Allocate
和 ReAllocate
相同的模式。 如果釋放的緩衝區是固定緩衝區,方法會將它設定為長度為零的鎖定緩衝區。 如果釋放的緩衝區已與備份管理員一起配置, 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