共用方式為


自訂字串管理員實作 (進階方法)

在特殊情況下,您可能想要實作自訂字串管理員,只變更用來配置記憶體的堆積。 在此情況下,您必須手動實 作 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 使用此緩衝區。

另請參閱

使用 CStringT 管理記憶體