Программирование на языке MFC

Мой второй блог в серии программирования

Присоединение блока памяти к объекту и отсоединение блока памяти от объекта


Но, думаю, у читателя уже возник вопрос – а как же быть в тех случаях, когда мы для создания файла в памяти используем кон­структор по умолчанию? Для того чтобы можно было ассоцииро­вать объект класса CMemFile с уже созданным буфером, можно воспользоваться методом Attach(). Его исходный код находится в файле filemem.cpp:

void CMemFile::Attach(BYTE* lpBuffer,

UINT nBufferSize, UINT nGrowBytes)

{

ASSERT(m_lpBuffer == NULL);

m_nGrowBytes = nGrowBytes;

m_nPosition = 0;

m_nBufferSize = nBufferSize;

m_nFileSize = nGrowBytes == 0 ? nBufferSize : 0; m_lpBuffer = lpBuffer; m_bAutoDelete = FALSE;

}

При вызове этого метода в качестве аргументов используются указатель на буфер в памяти, размер этого буфера и размер при­ращения, который по умолчанию равен нулю. Код метода полностью совпадает с кодом второго конструктора. Разница между ними в том, что при вызове конструктора создается объект класса, к ко­торому принадлежу вызываемый конструктор. При вызове мето­да (не конструктора) объект не создается. Следовательно, в отличие от вызова конструктора, при вызове метода AttachQ ранее созданный буфер в памяти ассоциируется с объектом класса CMemFile.

Для того чтобы «отсоединить» буфер от объекта, используется метод Detach():

BYTE* CMemFile::Detach() {

BYTE* lpBuffer = m_lpBuffer; m_lpBuffer = NULL; m_nFileSize = 0; m_nBufferSize = 0; m_nPosition = 0; return lpBuffer;

}

Фактически метод обнуляет поля объекта, после чего возвра­щает указатель на «отсоединенный» от объекта буфер. Этот указатель в дальнейшем может быть использован другими фраг­ментами программы.