アロケータコンテキストの使用
Core Foundation 内の各アロケータには コンテキスト(context) があります。コンテキストとは、オブジェクトのオペレーティング環境を定義する構造体で、通常は関数ポインタで構成されます。アロケータのコンテキストは、CFAllocatorContext 構造体によって定義されます。関数ポインタに加えて、構造体にはバージョン番号とユーザ定義データのフィールドが含まれています。
リスト 1 : CFAllocatorContext 構造体
typedef struct {
CFIndex version;
void * info;
const void *(*retain)(const void *info);
void (*release)(const void *info);
CFStringRef (*copyDescription)(const void *info);
void * (*allocate)(CFIndex size, CFOptionFlags hint, void *info);
void * (*reallocate)(void *ptr, CFIndex newsize, CFOptionFlags hint, void *info);
void (*deallocate)(void *ptr, void *info);
CFIndex (*preferredSize)(CFIndex size, CFOptionFlags hint, void *info);
} CFAllocatorContext;
info フィールドには、アロケータ用に特別に定義されたデータが含まれます。たとえば、アロケータは info フィールドを使用して未処理の割り当てを追跡できます。
アロケータコンテキスト (info フィールド) にユーザ定義データがある場合は、CFAllocatorGetContext 関数を使用してアロケータ用の CFAllocatorContext 構造体を取得します。次に、必要に応じてデータを評価または処理します。以下のコードは、この例です。
リスト 2 : アロケータコンテキストとユーザ定義データの取得
static int numOutstandingAllocations(CFAllocatorRef alloc) {
CFAllocatorContext context;
context.version = 0;
CFAllocatorGetContext(alloc, &context);
return (*(int *)(context.info));
}
その他の Core Foundation 関数は、アロケータコンテキストで定義されたメモリ関連の呼び出し関数を呼び出し、メモリブロックへの型なしポインタ (void *) を取得または返します。
- CFAllocatorAllocate は、メモリのブロックを割り当てます。
- CFAllocatorReallocate は、メモリのブロックを再割り当てします。
- CFAllocatorDeallocate は、メモリのブロックを割り当て解除します。
- CFAllocatorGetPreferredSizeForSize は、特定の要求があれば、割り当てられる可能性のあるメモリのサイズを示します。
前の章 次の章