Программирование на языке 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 динамически увеличивает размер буфера, ассоциированного с объектом, после чего корректирует указатель на буфер и зна­чение длины буфера.

Похожие статьи: