

Программирование на языке MFC
Мой второй блог в серии программирования
Метод GrowFile
При этом указатель, переданный в качестве аргумента, может не совпадать с возвращаемым указателем, так как в том случае, если просто увеличить длину блока не удается, метод просто выделяет новый буфер в другом месте, копирует туда содержимое исходного буфера, после чего исходный буфер освобождается.
Вернемся к методу GrowFile(). Исходный код этого метода находится в файле filemem.cpp:
void CMemFile::GrowFile(DWORD dwNewLen) {
ASSERT_VALID(this);
if (dwNewLen > m_nBufferSize) {
// grow the buffer
DWORD dwNewBufferSize = (DWORD)m_nBufferSize;
// watch out for buffers which cannot be grown! ASSERT(m_nGrowBytes != 0) ; if (m_nGrowBytes == 0)
AfxThrowMemoryException ();
// determine new buffer size while (dwNewBufferSize < dwNewLen) dwNewBufferSize += m_nGrowBytes;
// allocate new buffer
BYTE* lpNew;
if (m_lpBuffer == NULL)
lpNew = Alloc(dwNewBufferSize); else
lpNew = Realloc(m_lpBuffer, dwNewBufferSize);
if (lpNew == ftULL)
AfxThrowMemoryException (); m_lpBuffer = lpNew; m_nBufferSize = dwNewBufferSize;
}
ASSERT_VALID(this);
}
В качестве аргумента методу передается значение нового размера файла. Как следует из текста, метод будет отрабатывать только в том случае, если новый размер файла превышает нынешний размер файла. Кроме того, вспомните мое предположение о том, что, указываемый в конструкторе размер приращения определяет механизм выделения дополнительной памяти буферу? На самом деле, если значение приращения равно нулю, то метод немедленно сформирует исключение.
Но допустим, все прошло нормально. В таком случае метод определяет размер требуемого буфера. Как только размер требуемого буфера определен, метод пытается выделить требуемый блок памяти. При этом если у объекта еще не было ассоциированного с ним буфера, то метод пытается выделить буфер при помощи метода А11ос(). Если же у объекта был ассоциированный буфер, то метод использует для выделения памяти метод Realloc(). Если память по каким-то причинам выделена быть не может, то вырабатывается исключение. Если же все прошло нормально, то тогда метод корректирует указатель на буфер и значение длины буфера. Если оставить все детали, то можно сказать, что метод GrowFileQ динамически увеличивает размер буфера, ассоциированного с объектом, после чего корректирует указатель на буфер и значение длины буфера.
Похожие статьи: Метод GrowFile
