次の方法で共有


CStringData クラス

このクラスは、文字列オブジェクトのデータを表します。

構文

struct CStringData

メンバー

メソッド

Name 説明
AddRef 文字列データ オブジェクトの参照カウンターをインクリメントします。
data 文字列オブジェクトの文字データを取得します。
IsLocked 関連付けられた文字列オブジェクトのバッファーがロックされているかどうかを判断します。
IsShared 関連付けられた文字列オブジェクトのバッファーが現在共有されているかどうかを判断します。
ロック 関連付けられた文字列オブジェクトのバッファーをロックします。
リリース 指定した文字列オブジェクトをリリースします。
Unlock 関連付けられた文字列オブジェクトのバッファーのロックを解除します。

データ メンバー

名前 説明
nAllocLength XCHAR で割り当てられたデータの長さ (終端の null は含まない)
nDataLength XCHAR 内で現在使用されているデータの長さ (終端の null は含まない)
nRefs オブジェクトの現在の参照数。
pStringMgr この文字列オブジェクトの文字列マネージャーへのポインター。

解説

このクラスの使用は、カスタム文字列マネージャーを実装する開発者のみに限定する必要があります。 カスタム文字列マネージャーの詳細については、メモリ管理と CStringT に関するページを参照してください。

このクラスによって、上位の文字列オブジェクト (CStringTCSimpleStringTCFixedStringT オブジェクトなど) に関連付けられたさまざまな種類の情報およびデータがカプセル化されます。 上位の文字列オブジェクトのいずれにも、それに関連する CStringData オブジェクトへのポインターが含まれています。これにより、複数の文字列オブジェクトで、同じ文字列データ オブジェクトを指すことができます。 このリレーションシップは、CStringData オブジェクトの参照カウント (nRefs) によって表されます。

Note

文字列型 (CFixedString など) では、文字列データ オブジェクトを、複数の上位の文字列オブジェクトと共有しない場合もあります。 このことの詳細については、「CStringT を使用したメモリ管理」を参照してください。

このデータは次のもので構成されます。

  • 文字列のメモリ マネージャー (IAtlStringMgr 型)。

  • 文字列の現在の長さ (nDataLength)。

  • 文字列の割り当て済みの長さ (nAllocLength)。 パフォーマンス上の理由から、これは現在の文字列の長さと異なる場合があります。

  • CStringData オブジェクトの現在の参照数 (nRefs)。 この値は、同じ CStringData オブジェクトを共有する文字列オブジェクトの数を決定するために使用されます。

  • 文字列の実際の文字バッファー (data)。

    Note

    文字列オブジェクトの実際の文字バッファーは、文字列マネージャーによって割り当てられ、CStringData オブジェクトに追加されます。

要件

ヘッダー: atlsimpstr.h

CStringData::AddRef

文字列オブジェクトの参照数をインクリメントします。

void AddRef() throw();

解説

文字列オブジェクトの参照数をインクリメントします。

Note

負の参照数は文字列バッファーがロックされていることを示すため、数が負になっている文字列に対してこのメソッドを呼び出さないでください。

CStringData::data

文字列オブジェクトの文字バッファーへのポインターを返します。

void* data() throw();

戻り値

文字列オブジェクトの文字バッファーへのポインター。

解説

この関数を呼び出して、関連付けられている文字列オブジェクトの現在の文字バッファーを返します。

Note

このバッファーは、CStringData オブジェクトによって割り当てられるのではなく、必要に応じて文字列マネージャーによって割り当てられます。 バッファーは割り当てられると、文字列データ オブジェクトに追加されます。

CStringData::IsLocked

文字バッファーがロックされているかどうかを判断します。

bool IsLocked() const throw();

戻り値

バッファーがロックされている場合は TRUE を返します。それ以外の場合は FALSE を返します。

解説

文字列オブジェクトの文字バッファーが現在ロックされているかどうかを判断するには、この関数を呼び出します。

CStringData::IsShared

文字バッファーが共有されているかどうかを判断します。

bool IsShared() const throw();

戻り値

バッファーが共有されている場合は TRUE を返します。それ以外の場合は FALSE を返します。

解説

文字列データ オブジェクトの文字バッファーが、現在、複数の文字列オブジェクト間で共有されているかどうかを判断するには、この関数を呼び出します。

CStringData::Lock

関連付けられている文字列オブジェクトの文字バッファーをロックします。

void Lock() throw();

解説

文字列データ オブジェクトの文字バッファーをロックするには、この関数を呼び出します。 ロックとロック解除は、文字バッファーへの直接アクセスが開発者に必要な場合に使用されます。 ロックの例としては、CSimpleStringTLockBuffer および UnlockBuffer メソッドが挙げられます。

Note

文字バッファーは、上位の文字列オブジェクト間で共有されていない場合にのみ、ロックすることができます。

CStringData::nAllocLength

割り当てられた文字バッファーの長さ。

int nAllocLength;

解説

割り当てられたデータ バッファーの長さを XCHAR に格納します (終端の null は含まれません)。

CStringData::nDataLength

文字列オブジェクトの現在の長さ。

int nDataLength;

解説

XCHAR 内で現在使用されているデータの長さ (終端の null は含まない) を格納します。

CStringData::nRefs

文字列データ オブジェクトの参照数。

long nRefs;

解説

文字列データ オブジェクトの参照数を格納します。 この数は、文字列データ オブジェクトに関連付けられている上位の文字列オブジェクトの数を示します。 負の値は、文字列データ オブジェクトが現在ロックされている状態にあることを示します。

CStringData::pStringMgr

関連付けられた文字列オブジェクトのメモリ マネージャー。

IAtlStringMgr* pStringMgr;

解説

関連付けられた文字列オブジェクトのメモリ マネージャーを格納します。 メモリ マネージャーと文字列の詳細については、メモリ管理と CStringT に関するページを参照してください。

CStringData::Release

文字列データ オブジェクトの参照数をデクメントします。

void Release() throw();

解説

この関数を呼び出すと、参照数がデクリメントされ、参照数がゼロに達した場合に CStringData 構造が解放されます。 これは、通常、文字列オブジェクトが削除されたときに行われるため、文字列データ オブジェクトを参照する必要がなくなります。

たとえば、次のコードでは、str1 に関連付けられた文字列データ オブジェクトに対して CStringData::Release を呼び出します。

{
   CString str1 = _T("Hello world");  // Allocates new CStringData
}
// str1 is deleted when it goes out of scope, so it releases its string data   

CStringData::Unlock

関連付けられている文字列オブジェクトの文字バッファーのロックを解除します。

void Unlock() throw();

解説

文字列データ オブジェクトの文字バッファーのロックを解除するには、この関数を呼び出します。 バッファーは、ロックが解除されると、共有可能となり、参照をカウントできます。

Note

Lock の各呼び出しは、Unlock の対応する呼び出しと一致する必要があります。

ロックとロック解除が使用されるのは、開発者が、文字列データを決して共有されないようにしなければならない場合です。 ロックの例としては、CSimpleStringTLockBuffer および UnlockBuffer メソッドが挙げられます。

関連項目

階層図
ATL/MFC 共有クラス