CMemFile クラス

メモリ ファイルをサポートする CFile 派生クラス。

構文

class CMemFile : public CFile

メンバー

パブリック コンストラクター

名前 説明
CMemFile::CMemFile メモリ ファイル オブジェクトを構築します。

パブリック メソッド

名前 説明
CMemFile::Attach メモリのブロックを にアタッチします CMemFile
CMemFile::D etach メモリ ブロックをデタッチし、デタッチされたメモリ CMemFile ブロックへのポインターを返します。
CMemFile::GetBufferPtr メモリ ファイルをバックアップするメモリ バッファーを取得または書き込みます。

保護メソッド

名前 説明
CMemFile::Alloc メモリ割り当ての動作を変更するには、オーバーライドします。
CMemFile::Free メモリの割り当て解除動作を変更するオーバーライド。
CMemFile::GrowFile ファイルを拡大するときの動作を変更するには、オーバーライドします。
CMemFile::Memcpy ファイルの読み取りと書き込み時のメモリ コピー動作を変更するには、オーバーライドします。
CMemFile::Realloc メモリの再割り当て動作を変更するオーバーライド。

解説

これらのメモリ ファイルは、ファイルがディスクではなく RAM に格納されている点を除き、ディスク ファイルと同様に動作します。 メモリ ファイルは、次の場合に役立ちます。

  • 高速一時ストレージ
  • 独立したプロセス間で生バイトを転送する
  • 独立プロセス間でのシリアル化オブジェクトの転送

CMemFile オブジェクトは、独自のメモリを自動的に割り当てることができます。 または、Attach を呼び出して、独自のメモリ ブロックをオブジェクトにCMemFileアタッチすることもできます。 どちらの場合も、メモリ ファイルを自動的に拡張するためのメモリは、0 でない場合nGrowBytesは 、-size インクリメントでnGrowBytes割り当てられます。

メモリ がオブジェクトによってCMemFile最初に割り当てられた場合、メモリ ブロックはオブジェクトのCMemFile破棄時に自動的に削除されます。それ以外の場合は、オブジェクトにアタッチしたメモリの割り当てを解除する必要があります。

Detach を呼び出すことによって、オブジェクトからデタッチするときに指定されたポインターを介してメモリ ブロックにCMemFileアクセスできます。

最も一般的な用途CMemFileは、オブジェクトをCMemFile作成し、CFile メンバー関数を呼び出して使用することです。 自動的にCMemFile作成すると開きます。CFile::Open は呼び出しません。これはディスク ファイルにのみ使用されます。 ディスク ファイルを使用しないため CMemFile 、データ メンバー CFile::m_hFile は使用されません。

メンバー関数 Duplicate、LockRange、UnlockRange は実装されていませんCMemFileCFile オブジェクトでこれらの関数をCMemFile呼び出すと、CNotSupportedException が取得されます。

CMemFileでは、ランタイム ライブラリ関数 malloc、reallocFree を使用してメモリの割り当て、再割り当て、割り当て解除を行い、読み取りと書き込み時にコピー メモリをブロックする組み込み memcpy を使用します。 この動作またはファイルを拡張するときの CMemFile 動作を変更する場合は、適切な関数から CMemFile 独自のクラスを派生させ、オーバーライドします。

詳細については、「MFC およびメモリ管理 (MFC) のファイル」および「ランタイム ライブラリ リファレンス」の「ファイル処理」を参照してくださいCMemFile

継承階層

CObject

Cfile

CMemFile

必要条件

ヘッダー: afx.h

CMemFile::Alloc

この関数は、メンバー関数によって呼び出されます CMemFile

virtual BYTE* Alloc(SIZE_T nBytes);

パラメーター

nBytes
割り当てられるメモリのバイト数。

戻り値

割り当てられたメモリ ブロックへのポインター。割り当てが失敗した場合は NULL。

解説

カスタム メモリ割り当てを実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、Free と Realloc もオーバーライドする必要があります。

既定の実装では、ランタイム ライブラリ関数 malloc を使用してメモリを割り当てます。

CMemFile::Attach

この関数を呼び出して、メモリ CMemFileブロックを .

void Attach(
    BYTE* lpBuffer,
    UINT nBufferSize,
    UINT nGrowBytes = 0);

パラメーター

lpBuffer
アタッチ CMemFileするバッファーへのポインター。

nBufferSize
バッファーのサイズをバイト単位で指定する整数。

nGrowBytes
メモリ割り当ての増分 (バイト単位)。

解説

これにより、 CMemFile メモリ ファイルとしてメモリ ブロックが使用されます。

nGrowBytes が 0 の場合CMemFileファイルの長さを nBufferSize に設定します。 これは、アタッチ CMemFile される前のメモリ ブロック内のデータがファイルとして使用されることを意味します。 この方法で作成されたメモリ ファイルを拡大することはできません。

ファイルを拡張できないため、ファイルの拡張を CMemFile 試みないように注意してください。 たとえば、CFile:Write のオーバーライドをCMemFile呼び出して末尾を超えて書き込んだり、長さが nBufferSize より長い CFile:SetLength を呼び出したりしないでください。

nGrowBytes が 0 より大きい場合CMemFileアタッチしたメモリ ブロックの内容は無視されます。 のオーバーライドCFile::Writeを使用して、メモリ ファイルの内容をCMemFile最初から書き込む必要があります。 ファイルの末尾を超えて書き込もうとしたり、オーバーライドを呼び出してファイルをCMemFile拡張しようとすると、CMemFileメモリ割り当てが nGrowBytes 単位で増加しますCFile::SetLengthAttachすメモリ ブロックが Alloc と互換性のあるメソッドで割り当てられなかった場合、メモリ割り当ての増加は失敗します。 既定の Alloc実装と互換性を持つには、ランタイム ライブラリ関数 malloc または calloc を使用してメモリを割り当てる必要があります。

CMemFile::CMemFile

最初のオーバーロードでは、空のメモリ ファイルが開きます。

CMemFile(UINT nGrowBytes = 1024);

CMemFile(
    BYTE* lpBuffer,
    UINT nBufferSize,
    UINT nGrowBytes = 0);

パラメーター

nGrowBytes
メモリ割り当ての増分 (バイト単位)。

lpBuffer サイズ nBufferSize の情報を受け取るバッファーへのポインター。

nBufferSize
ファイル バッファーのサイズをバイト単位で指定する整数。

解説

ファイルはコンストラクターによって開かれます。 CFile::Open を呼び出さないでください。

2 番目のオーバーロードは、最初のコンストラクターを使用し、すぐに同じパラメーターで Attach を呼び出した場合と同じように動作します。 詳細については、Attach を参照してください。

CMemFile f; // Ready to use - no Open necessary.

BYTE * pBuf = (BYTE *)new char [1024];
CMemFile g(pBuf, 1024, 256);
// same as CMemFile g; g.Attach(pBuf, 1024, 256);

CMemFile::D etach

この関数を呼び出して、使用されているメモリ ブロックへのポインターを取得します CMemFile

BYTE* Detach();

戻り値

メモリ ファイルの内容を格納しているメモリ ブロックへのポインター。

解説

この関数を呼び出すと、 CMemFile. Attach を呼び出すことによって、メモリ ブロックをCMemFile再アタッチできます。 ファイルを再アタッチし、その中のデータを使用する場合は、CFile::GetLength を呼び出して、呼び出Detach前にファイルの長さを取得する必要があります。 データ ( nGrowBytes == 0) を使用できるようにメモリ ブロックCMemFileをアタッチした場合、メモリ ファイルを拡張することはできません。

CMemFile::Free

この関数は、メンバー関数によって呼び出されます CMemFile

virtual void Free(BYTE* lpMem);

パラメーター

lpMem
割り当てを解除するメモリへのポインター。

解説

カスタム メモリの割り当て解除を実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、Alloc と Realloc もオーバーライドする必要があります。

CMemFile::GetBufferPtr

メモリ ファイルをバックアップするメモリ バッファーを取得または書き込みます。

virtual UINT GetBufferPtr(
    UINT nCommand,
    UINT nCount = 0,
    void** ppBufStart = NULL,
    void** ppBufMax = NULL
);

パラメーター

nCommand
実行する bufferCommand (bufferCheck、、、bufferCommitbufferReadまたはbufferWrite)。

nCount
nCommand応じて、読み取り、書き込み、またはコミットするバッファー内のバイト数。 バッファーから読み取る場合は、-1 を指定して、ファイルの現在位置から末尾までのバッファーを返します。

ppBufStart
[out]バッファーの先頭。 NULLnCommandbufferCommit.

ppBufMax
[out]バッファーの末尾。 NULL nCommand が bufferCommit.

戻り値

コマンド 戻り値
buffercheck ダイレクト バッファリングが サポートされている場合は bufferDirect を返し、それ以外の場合は 0 を返します。
bufferCommit 0 を返します。
bufferRead または bufferWrite 返されたバッファー領域のバイト数を返します。 ppBufStartppBufMax は、読み取り/書き込みバッファーの開始と終了を指します。

解説

メモリ バッファー (m_nPosition) 内の現在の位置は、nCommand に応じて、次の方法で 進みます

nCommand バッファー位置
bufferCommit 現在の位置は、コミットされたバッファーのサイズによって進みます。
bufferRead 現在の位置は、読み取りバッファーのサイズによって進みます。

CMemFile::GrowFile

この関数は、いくつかのメンバー関数によって呼び出されます CMemFile

virtual void GrowFile(SIZE_T dwNewLen);

パラメーター

dwNewLen
メモリ ファイルの新しいサイズ。

解説

ファイルの拡大方法 CMemFile を変更する場合は、オーバーライドできます。 既定の実装では、Realloc を呼び出して既存のブロック (またはメモリ ブロックを作成する Alloc) を拡張し、コンストラクターまたは Attach 呼び出しで指定された値のnGrowBytes倍数でメモリを割り当てます。

CMemFile::Memcpy

この関数は、メモリ ファイルとの間でデータを転送する CFile::Read および CFile::Write のオーバーライドによってCMemFile呼び出されます。

virtual BYTE* Memcpy(
    BYTE* lpMemTarget,
    const BYTE* lpMemSource,
    SIZE_T nBytes);

パラメーター

lpMemTarget
ソース メモリのコピー先となるメモリ ブロックへのポインター。

lpMemSource
ソース メモリ ブロックへのポインター。

nBytes
コピー対象のバイト数。

戻り値

lpMemTargetコピー。

解説

これらのメモリ コピーの実行方法 CMemFile を変更する場合は、この関数をオーバーライドします。

CMemFile::Realloc

この関数は、メンバー関数によって呼び出されます CMemFile

virtual BYTE* Realloc(
    BYTE* lpMem,
    SIZE_T nBytes);

パラメーター

lpMem
再割り当てするメモリ ブロックへのポインター。

nBytes
メモリ ブロックの新しいサイズ。

戻り値

再割り当て (および場合によっては移動) されたメモリ ブロックへのポインター。再割り当てが失敗した場合は NULL。

解説

カスタム メモリの再割り当てを実装するには、この関数をオーバーライドします。 この関数をオーバーライドする場合は、AllocFree もオーバーライドする必要があります。

関連項目

CFile クラス
階層図