Класс 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) и см. в разделе "Обработка файлов" в справочнике по библиотеке времени выполнения.
Иерархия наследования
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
или bufferRead
bufferWrite
).
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 , а также.