前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

13.4. 内部バッファ

文字列クラスは煩雑なバッファ ( メモリ ) 管理をカプセル化してくれます。

13.4.1. C 言語文字列の取り出し

文字列クラスは、文字列を格納する内部バッファを持ちます。

内部バッファの終端には自動的に '\0' が付加されます。

内部バッファのポインターを取得する関数は2種類あります。

表 13.4. 内部バッファポインター取得関数

関数名 解説 文字列が「空」である場合の振る舞い
SFXAnsiString::GetBuffer 文字列の内部バッファーへのポインターを取得します。 null を返します。
SFXAnsiString::GetCString 文字列の内部バッファーへの const ポインターを取得します。(内部バッファーの内容を変更できません) "\0" へのポインターを返します。
[Note] 注意
文字列が空文字列のとき、SFXAnsiString::GetBuffer は null を、 SFXAnsiString::GetCString は '\0' を指すポインターを返します。

例 13.31. SFXAnsiString::GetBufferSFXAnsiString::GetCString の動作の違い

SFXAnsiString str;

// null ポインターを返すのでエラーが起こる
TRACE("%s", str.GetBuffer());

// 空文字を指すポインターを返すので正しく動作する
TRACE("%s", str.GetCString());

13.4.2. 複数の '\0' を含む文字列

文字列クラスでは、複数の '\0' を含む文字列を扱えます。

以下の関数の動作は異なります。

表 13.5. 複数の '\0' を含む文字列動作一覧

関数名 解説
SFXAnsiString::GetLength 文字列の文字数を取得します。
SFXAnsiString::GetLengthCString 先頭の null ターミネート文字列の文字数を取得します。
SFXAnsiString::IsEmpty 文字列の長さが 0 か判定します。
SFXAnsiString::IsEmptyCString 先頭の文字列が null ターミネートか判定します。

例 13.32. 複数の '\0' を含む文字列の処理

// 第 2 引数で文字列の長さを設定しない場合は "abc" だけが登録される
SFXAnsiString str("abc\0abc\0\0abc", 12);

SInt32 i = str.GetLength();         // i = 12
SInt32 j = str.GetLengthCString();  // j = 3

13.4.3. 内部バッファの委譲

Attach 関数は、文字列クラスの内部バッファを破棄し、ユーザーが MemoryAllocate などで確保したメモリを内部バッファとする関数です。

Attach したメモリは文字列クラスが解放権を持ちます。

例 13.33. Attach 関数の使い方

// 第 2 引数で文字列の長さを設定しない場合は "abc" だけが登録される
SFXAnsiString str;
ACharPtr ptr;

ptr = static_cast<ACharPtr>(MemoryAllocate(10240)); // メモリを確保する

// 確保したメモリを使う処理

// 確保したメモリを文字列クラスに移譲する
str.Attach(ptr, 10240);

// ptr を明示的に解放してはいけない

// Attach 関数を使わない場合
// str.Set(ptr, 10240); // ptr の中身がコピーされるので、スピードは遅くなることに注意が必要

Detach 関数は、文字列クラスの内部バッファの解放権をユーザーに渡す関数です。

Detach 関数が返すメモリ ( へのポインター ) はユーザーが MemoryFree で解放する必要があります。

例 13.34. Detach 関数の使い方

SFXAnsiString str;
ACharPtr ptr;
SInt32 length;

str = "The best application for BREW.";

// str を使う処理

// 内部バッファの解放権をユーザーに渡す
ptr = str.Detach(&length);

// ptr のサイズを表示する
TRACE("%d", length);

// ptr を使う処理

// 必ず ptr を解放する
MemoryFree(ptr);