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


Implementation of a Custom String Manager (Advanced Method)

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

Чтобы сделать это, необходимо сначала понимает, как использовать CStringT, которые взаимодействуют для управления его данные строк. Каждый экземпляр CStringT содержит указатель на структуру CStringData. Эта переменной длины структура содержит важные сведения о строке (длины), а также фактические символьные данные для строки. Каждый пользовательский диспетчер строки отвечает за выделение и освобождение эти структуры по запросу CStringT.

Структура CStringData состоит из 4 полей:

  • pStringMgr точки этого поля к интерфейсу IAtlStringMgr, используемому для управления эти данные строк. При необходимости CStringT reallocate или освободить буфер строк он вызывает Reallocate или методы free этого взаимодействует, передавая структуру CStringData в качестве параметра. Выбор структуры CStringData в диспетчере строки необходимо настроить это поле на момент в пользовательский диспетчер строки.

  • nDataLength это поле содержит текущую логическую длину строки, хранящегося в буфере, исключая конечное значение null. CStringT обновляет это поле, когда длина строки изменяется. Выбор структуры CStringData, диспетчер строки должен задать для этого поля равным нулю. Reallocating структура CStringData, пользовательский диспетчер строки должен оставить это поле.

  • nAllocLength это поле содержит наибольшее количество символов (исключая конечное значение null), которые могут храниться в данном буфере строки без reallocating его. При необходимости CStringT увеличить логически длину строки, он сначала проверить это поле, чтобы обеспечить достаточно места в буфере. Если проверка завершается неуспешно, вызовы CStringT в пользовательский диспетчер строки для reallocate буфер. Если выбрать или reallocating структура CStringData, следует установить этому полю значение хотя бы число символов спрошенных в параметре nChars к IAtlStringMgr::Allocate или IAtlStringMgr::Reallocate. Если больше места в буфере, чем запрошено, можно установить это значение, чтобы отразить реальный объем доступного пространства. Это позволяет CStringT увеличиваться, что строка заполнило всю выделенную память, прежде чем оно должно вызвать обратно в диспетчер строки для reallocate буфер.

  • nRefs это поле содержит текущий счетчик ссылок буфера строки. Если значение, то единственный экземпляр класса CStringT использует буфер. Кроме того, экземпляр разрешения и чтение и изменяет содержимое буфера. Если значение больше, несколько экземпляров CStringT могут использовать буфер. Поскольку буфер символов совместно использовать экземпляры CStringT могут только считывать содержимое буфера. Чтобы изменить содержимое, CStringT сначала создает копию буфера. Если значение отрицательное, то только один экземпляр CStringT использует буфер. В этом случае буфер считается заблокированным. Если экземпляр CStringT блокированных использует буфер не существует других экземпляров CStringT могут совместно использовать буфер. Вместо этого эти экземпляры создают копии буфера до обработки содержимого. Кроме того, экземпляр CStringT блокированных используя буфер не пытается совместно использовать буфер любого другого экземпляра CStringT присвоенного ему. В этом случае экземпляр CStringT копирует другая строка блокированных в буфер.

    Выбор структуры CStringData, необходимо задать это поле, чтобы отразить тип совместно использовать одно разрешено буфера. В большинстве реализаций, установите это значение равным единице. Это позволяет обычная копия-на- записи совместно с помощью расширения функциональности. Однако если диспетчер строки не поддерживает совместное использование буфер строк, то установите это поле состояния блокированных. Это заставляет CStringT только для того, чтобы использовать этот буфер для экземпляра CStringT, который выбрал его.

См. также

Основные понятия

Memory Management with CStringT