CFixedStringT : カスタム文字列マネージャーの例

ATL ライブラリは CFixedStringMgrというクラス CFixedStringTで使用するカスタム文字列マネージャーの 1 例を実行します。CFixedStringTCStringT から文字列がである限り派生し、CFixedStringT のオブジェクトの一部として CFixedStringTt_nChars のテンプレート パラメーターで指定された長さ未満文字データ自体を割り当てる文字列を実装します。この方法によって、文字列の長さが固定バッファーのサイズより大きく育たなければ、ヒープは必要ではありません。文字列データを割り当てるには CFixedStringT がヒープを使用しないため、文字列マネージャーとして CAtlStringMgr を使用できません。これは IAtlStringMgr のインターフェイスを実装するカスタム文字列CFixedStringMgrマネージャーを使用します。このインターフェイスは カスタム文字列マネージャー (高度なメソッド) の実装で説明します。

CFixedStringMgr のコンストラクターは 3 個のパラメーターを受け取ります:

  • 使用する CStringData の固定構造体へのpData: 指すポインター。

  • nChars:CStringData の構造が保持できる最大文字数。

  • 「バックアップ文字列マネージャーの IAtlStringMgr インターフェイスへのpMgr: 示すポインター」。

コンストラクターは、それぞれのメンバー変数に pDatapMgr の値を格納します (m_pDatam_pMgr)。次に、バッファーの長さ、固定バッファーの最大サイズと等しい使用できる長さ、– 1、参照カウントがゼロに設定します。参照の数値は、バッファーが CFixedStringMgr のこのインスタンスを文字列マネージャーとして使用するロックされることを示します。

ロックされたバッファーにとしてマークすることは CStringT の他のインスタンスが共有バッファーへの参照を保持することを防止できます。CStringT の他のインスタンスがバッファーを共有するそのほかの文字列がまだバッファーを使用して、削除する CFixedStringT に含まれるバッファーに対してできます。

CFixedStringMgrIAtlStringMgr のインターフェイスの完全な実装です。各メソッドの実装は別に説明します。

CFixedStringMgr::Allocate の実装

CFixedStringMgr::Allocate の実装では、最初に文字列の要求されたサイズが固定バッファーのサイズ以下であるかどうかを確認します ( m_pData のメンバーに格納されます)。固定バッファーのサイズが十分にある場合、はゼロ CFixedStringMgr の長さの固定バッファーをロックします。文字列の長さが固定バッファーのサイズより大きく育たない限り、CStringT がバッファーを再割り当てする必要はありません。

文字列の要求されたサイズがより大きい固定バッファー CFixedStringMgr はバックアップに要求を文字列マネージャーが転送されます。バックアップ文字列マネージャーはヒープからバッファーを割り当てると推論されます。ただし、このバッファー CFixedStringMgr を返す前にバッファーをロックし、ポインターと CFixedStringMgr のオブジェクトにバッファーの文字列マネージャーのポインターを置き換えます。これはことを CFixedStringMgrCStringT の際によってバッファーを再割り当てするか、解放しようとします。

CFixedStringMgr::ReAllocate の実装

CFixedStringMgr::ReAllocate の実装は Allocateの実装とよく似ています。

バッファーが再割り当てされる固定バッファーであり、要求されたバッファー サイズが固定バッファーより小さい場合、代入は行われません。ただし、バッファーが再割り当てされる固定バッファーでない場合、バックアップ マネージャーによって割り当てられたバッファーである必要があります。この場合、バックアップ マネージャーがバッファーを再割り当てするために使用されます。

バッファーが再割り当てされる固定バッファーで、新しいバッファー サイズが固定バッファー内に収まらない場合は CFixedStringMgr バックアップ マネージャーを使用して新しいバッファーを割り当てます。固定バッファーの内容が新しいバッファーにコピーします。

CFixedStringMgr::Free の実装

CFixedStringMgr::Free の実装は AllocateReAllocateと同じパターンに従います。解放バッファーが固定バッファーの場合、メソッドは長さによってロックされたバッファーに設定されます。解放バッファーをバックアップ マネージャーと、CFixedStringMgr 割り当てられている場合は、それを解放するためにバックアップ マネージャーを使用します。

CFixedStringMgr::Clone の実装

の実装 CFixedStringMgr::Clone ポインター自体を CFixedStringMgr ではなくバックアップ マネージャーに常に返します。これは CFixedStringMgr のすべてのインスタンスに CStringTの一つのインスタンスのみに関連付けることができないためです。マネージャーを複製することをお CStringT の他のインスタンスがバックアップ マネージャーを派生させる必要があります。これは、共有されるバックアップ マネージャーのサポートです。

CFixedStringMgr::GetNilString の実装

CFixedStringMgr::GetNilString の実装は、固定バッファーを返します。CFixedStringMgrCStringTの一対一の対応するために、CStringT のインスタンスは、複数のバッファーを同時に使用できません。したがって、未の文字列と実際の文字列バッファーは、同時に必要ではありません。

固定バッファーが使用されていない場合は、CFixedStringMgr は長さで初期化されることを確認します。これは、未の文字列として使用できます。追加されたボーナスとして、固定バッファーの nAllocLength のメンバーは、固定バッファーの最大サイズで常にに設定されます。これは CStringTIAtlStringMgr::Reallocateを呼び出したりしないで文字列を拡張できることを意味します、文字列の場合は。

要件

ヘッダー: cstringt.h

参照

概念

CStringT によるメモリ管理