在特殊情況下,您可能想要實作自定義字串管理員,只變更用來配置記憶體的堆積。 在此情況下,您必須手動實 作 IAtlStringMgr 介面作為自定義字串管理員。
若要這樣做,請務必先瞭解 CStringT 如何使用該介面來管理其字串數據。 的每個實例CStringT都有 CStringData 結構的指標。 這個可變長度結構包含字串的重要資訊(例如 length),以及字串的實際字元數據。 每個自定義字串管理員都會負責在的要求 CStringT下配置和釋放這些結構。
結構 CStringData 包含四個字位:
pStringMgr 此字段會指向
IAtlStringMgr用來管理此字串數據的介面。 當CStringT需要重新配置或釋放字串緩衝區時,它會呼叫這個介面的 Reallocate 或 Free 方法,將CStringData結構傳遞為參數。 在字串管理員中配置CStringData結構時,您必須將此欄位設定為指向您的自訂字串管理員。nDataLength 此字段包含目前儲存在緩衝區中之字串的邏輯長度,但不包括終止 Null。
CStringT當字串的長度變更時,會更新此欄位。 配置CStringData結構時,您的字串管理員必須將此欄位設定為零。 重新配置CStringData結構時,您的自定義字串管理員必須讓此欄位保持不變。nAllocLength 此字段包含可以儲存在此字串緩衝區中而不重新配置的最大字元數(不包括終止 Null)。 每當
CStringT需要增加字串的邏輯長度時,它會先檢查此欄位,以確定緩衝區中有足夠的空間。 如果檢查失敗,CStringT請呼叫自定義字串管理員以重新配置緩衝區。 配置或重新配置CStringData結構時,您必須將此字段設定為至少 nChars 參數中要求的字元數目為 IAtlStringMgr::Allocate 或 IAtlStringMgr::Reallocate。 如果緩衝區中有比要求更多的空間,您可以設定此值以反映可用的實際空間量。 這可讓CStringT字串成長以填滿整個已配置的空間,然後才必須回呼至字串管理員以重新配置緩衝區。nRefs 此欄位包含字串緩衝區的目前參考計數。 如果值為其中一個,則的單一實例
CStringT會使用 緩衝區。 此外,實例也允許讀取和修改緩衝區的內容。 如果值大於一個,則的CStringT多個實例可以使用 緩衝區。 因為字元緩衝區是共用的,CStringT因此實例只能讀取緩衝區的內容。 若要修改內容,CStringT請先建立緩衝區的複本。 如果值為負數,則 只有一個 實例CStringT使用緩衝區。 在此情況下,緩衝區會被視為已鎖定。CStringT當實例使用鎖定的緩衝區時,沒有其他 實例CStringT可以共用緩衝區。 相反地,這些實例會在操作內容之前建立緩衝區的複本。 此外,使用鎖定緩衝區的CStringT實例不會嘗試共用指派給它的任何其他CStringT實例的緩衝區。 在此情況下,實例會將CStringT另一個字串複製到鎖定的緩衝區。配置
CStringData結構時,您必須設定此欄位,以反映緩衝區允許的共用類型。 針對大部分的實作,請將此值設定為一個。 這允許一般寫入時複製共享行為。 不過,如果您的字串管理員不支援共用字串緩衝區,請將此欄位設定為鎖定狀態。 這會強制CStringT只針對配置它的 實例CStringT使用此緩衝區。