Поделиться через


Класс 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 Переопределите, чтобы изменить поведение перемещений памяти.

Замечания

Эти файлы памяти ведут себя как файлы дисков, за исключением того, что файл хранится в ОЗУ, а не на диске. Файл памяти полезен для:

  • быстрое временное хранилище
  • передача необработанных байтов между независимыми процессами
  • передача сериализованных объектов между независимыми процессами

CMemFile Объекты могут автоматически выделять собственную память. Кроме того, вы можете подключить собственный блок памяти к объектуCMemFile, вызвав подключение. В любом случае память для увеличения файла памяти автоматически выделяется в nGrowBytesразмерах приращения, если nGrowBytes не равно нулю.

Блок памяти будет автоматически удален при уничтожении CMemFile объекта, если память была первоначально выделена CMemFile объектом; в противном случае вы несете ответственность за выделение памяти, подключенной к объекту.

Вы можете получить доступ к блоку памяти через указатель, предоставленный при отсоедините его от CMemFile объекта, вызвав отсоединение.

Наиболее распространенным способом CMemFile является создание CMemFile объекта и его использование путем вызова функций-членов CFile . CMemFile Создание автоматически открывается: не вызывается CFile::Open, который используется только для файлов дисков. Так как CMemFile файл диска не используется, элемент CFile::m_hFile данных не используется.

Функции-члены CFile Дублируются, LockRange и UnlockRange не реализуются для CMemFile. При вызове CMemFile этих функций в объекте вы получите CNotSupportedException.

CMemFileиспользует функции библиотеки времени выполнения malloc, realloc и бесплатные для выделения, перераспределирования и освобождения памяти; и встроенной memcpy для блокировки памяти копирования при чтении и записи. Если вы хотите изменить это поведение или поведение при CMemFile росте файла, наследуйте собственный класс от CMemFile и переопределите соответствующие функции.

Дополнительные сведения CMemFileсм. в статьях "Файлы в MFC и управлении памятью" (MFC) и см. в разделе "Обработка файлов" в справочнике по библиотеке времени выполнения.

Иерархия наследования

CObject

CFile

CMemFile

Требования

Заголовок: afx.h

CMemFile::Alloc

Эта функция вызывается функциями-членами CMemFile .

virtual BYTE* Alloc(SIZE_T nBytes);

Параметры

nBytes
Количество байтов памяти, выделяемых.

Возвращаемое значение

Указатель на выделенный блок памяти или NULL, если выделение завершилось сбоем.

Замечания

Переопределите эту функцию для реализации выделения пользовательской памяти. Если вы переопределите эту функцию, вы, вероятно, хотите переопределить Free и Realloc , а также.

Реализация по умолчанию использует функцию библиотеки времени выполнения для выделения памяти.

CMemFile::Attach

Вызовите эту функцию, чтобы подключить блок памяти к CMemFile.

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

Параметры

lpBuffer
Указатель на буфер, к которому необходимо подключиться CMemFile.

nBufferSize
Целое число, указывающее размер буфера в байтах.

nGrowBytes
Увеличение выделения памяти в байтах.

Замечания

Это приводит CMemFile к использованию блока памяти в качестве файла памяти.

Если значение nGrowBytes равно 0, CMemFile присвойте длине файла значение nBufferSize. Это означает, что данные в блоке памяти перед присоединением CMemFile к нему будут использоваться в качестве файла. Файлы памяти, созданные таким образом, нельзя создавать.

Так как файл не может быть выращен, будьте осторожны, чтобы не пытаться CMemFile увеличить файл. Например, не вызывайте CMemFile переопределения CFile:Write для записи в конце или не вызывайте CFile:SetLength длиной дольше nBufferSize.

Если nGrowBytes больше 0, CMemFile будет игнорировать содержимое подключенного блока памяти. Необходимо написать содержимое файла памяти с нуля с помощью CMemFile переопределения CFile::Write. Если вы пытаетесь записать в конце файла или увеличить файл путем вызова CMemFile переопределения CFile::SetLength, CMemFile будет увеличивать выделение памяти в добавочных значениях nGrowBytes. Увеличение выделения памяти завершится ошибкой, если переданный Attach блок памяти не был выделен с методом, совместимым с Alloc. Чтобы обеспечить совместимость с реализацией Allocпо умолчанию, необходимо выделить память с функцией библиотеки времени выполнения malloc или calloc.

CMemFile::CMemFile

Первая перегрузка открывает пустой файл памяти.

CMemFile(UINT nGrowBytes = 1024);

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

Параметры

nGrowBytes
Увеличение выделения памяти в байтах.

Указатель lpBuffer на буфер, который получает сведения о размере nBufferSize.

nBufferSize
Целое число, указывающее размер буфера файла в байтах.

Замечания

Файл открывается конструктором. Не вызывайте CFile::Open.

Вторая перегрузка действует так же, как если бы вы использовали первый конструктор и немедленно вызвали подключение с теми же параметрами. Подробные сведения см. в разделе 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. Вы можете повторно подключить блок памяти, CMemFile вызвав подключение. Если вы хотите повторно подключить файл и использовать данные в нем, необходимо вызвать CFile::GetLength , чтобы получить длину файла перед вызовом Detach. При присоединении блока CMemFile памяти к тому, чтобы можно было использовать его данные ( nGrowBytes == 0), вы не сможете увеличить файл памяти.

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,, bufferCommitили bufferReadbufferWrite ).

nCount
В зависимости от nCommand число байтов в буфере для чтения, записи или фиксации. При чтении из буфера укажите -1, чтобы вернуть буфер из текущей позиции в конец файла.

ppBufStart
[out] Начало буфера. Должен быть NULL , если nCommand имеет значение bufferCommit.

ppBufMax
[out] Конец буфера. Должен быть NULL , если nCommand имеет значение bufferCommit.

Возвращаемое значение

значение команды Возвращаемое значение
buffercheck Возвращает буферDirect , если поддерживается прямая буферизация, в противном случае — значение 0.
bufferCommit Возвращает 0.
bufferRead или bufferWrite Возвращает количество байтов в возвращаемом буферном пространстве. ppBufStart и ppBufMax указывают на начало и конец буфера чтения и записи.

Замечания

Текущая позиция в буфере памяти (m_nPosition) расширена следующим образом в зависимости от nCommand:

nCommand Позиция буфера
bufferCommit Текущая позиция перемещается по размеру зафиксированного буфера.
bufferRead Текущая позиция перемещается по размеру буфера чтения.

CMemFile::GrowFile

Эта функция вызывается несколькими функциями-членами CMemFile .

virtual void GrowFile(SIZE_T dwNewLen);

Параметры

dwNewLen
Новый размер файла памяти.

Замечания

Его можно переопределить, если вы хотите изменить CMemFile способ роста файла. Реализация по умолчанию вызывает Realloc для увеличения существующего блока (или alloc для создания блока памяти), выделения памяти в нескольких значениях, указанных nGrowBytes в конструкторе или вызове присоединения.

CMemFile::Memcpy

Эта функция вызывается CMemFile переопределениями CFile::Read и CFile::Write для передачи данных в файл памяти и из нее.

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, если перемещено не удалось.

Замечания

Переопределите эту функцию, чтобы реализовать перемещение пользовательской памяти. Если вы переопределите эту функцию, вы, вероятно, хотите переопределить Alloc и Free , а также.

См. также

Класс CFile
Диаграмма иерархии