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


CFixedStringT: Пример пользовательского диспетчера строки

Библиотека библиотеки ATL реализует один пример пользовательского диспетчера строки, используемый классом CFixedStringT вызова, CFixedStringMgr.CFixedStringT является производным от CStringT и реализует строку, которая выбирает его символьные сами данные как часть объекта CFixedStringT до тех пор, пока строка, чем длина, указанная параметром шаблона t_nCharsCFixedStringT.При таком подходе строке не требуется куча, если длина строки не будет увеличение за размером буфера фиксированного.Поскольку CFixedStringT не всегда использует кучу, чтобы выбрать его данные строки, они не могут использоваться в качестве CAtlStringMgr диспетчер строки.Он использует пользовательский диспетчер строки (CFixedStringMgr), реализующий интерфейс IAtlStringMgr.Этот интерфейс, обсуждаемой в Реализация пользовательского диспетчера строки (расширенный метод).

Конструктор для CFixedStringMgr принимает 3 параметров.

  • Указатель на структуру pData: a фиксированной CStringData для использования.

  • nChars: Максимальное число символов, которые могут храниться в структуре CStringData.

  • Указатель на интерфейс pMgr: a IAtlStringMgr "резервного диспетчера строк".

Конструктор сохраняет значения pData и pMgr в соответствующих переменных-членов (m_pData и m_pMgr).Затем он устанавливает длину буфера равным нулю, доступную длину, равную к максимальному размеру буфера фиксированного и счетчика ссылок в значение – 1.Значение счетчика ссылок означает, что блокировать буфер и использовать этот экземпляр CFixedStringMgr, как диспетчер строки.

Пометить буфер в виде блокирована запрещает другие экземпляры CStringT из хранить общую ссылку на буфер.Если другие экземпляры CStringT были разрешены для совместного использования буфер можно для буфера, который содержит CFixedStringT для удаления, когда другие строки по-прежнему использовать буфер.

CFixedStringMgr полная реализация интерфейса IAtlStringMgr.Реализация каждого метода рассматривается отдельно.

Реализация CFixedStringMgr::Allocate

Реализация CFixedStringMgr::Allocate сначала проверяет, если запрошенный размер строки меньше или равно размеру буфера фиксированного (сохраненные в элементе m_pData ).Если в фиксированном буфере достаточно большой, CFixedStringMgr блокирует фиксированный буфер с длиной нулю.Если длина строки не будет увеличиваться за размером буфера фиксированного CStringT reallocate буфер.

Если запрошенный размер строки превышает размер буфера фиксированного CFixedStringMgr переадресует запрос на резервный шнурует диспетчер.Предполагается, что диспетчер строки выбираются резервный буфер из кучи.Однако перед возвратом этот буфер CFixedStringMgr блокирует буфер и заменяет указатель диспетчеризации строки буфера с использованием указателя на объект CFixedStringMgr.Это гарантирует, что при reallocate или освободить буфер вызывать CStringT в CFixedStringMgr.

Реализация CFixedStringMgr::ReAllocate

Реализация CFixedStringMgr::ReAllocate очень похожа на его реализации РАЗМЕСТИТЬ.

Если, reallocated буфер фиксированного буфер и запрашиваемый размер буфера меньше, чем фиксированный размер буфера, выделение не выполняется.Однако если буфер, reallocated нет фиксированного буфера, то должно быть резервным буфером выделенным с диспетчером.В этом случае резервного диспетчер используется для reallocate буфер.

Если, reallocated буфер фиксированного буфер и новый размер буфера слишком велик для приспособления в фиксированном буфере, CFixedStringMgr выделяется новый буфер с помощью диспетчера резервного копирования.Содержимое буфера фиксированного затем копируются в новый буфер.

Реализация CFixedStringMgr::Free

Реализация CFixedStringMgr::Free соответствовать одному и тому же шаблону, как РАЗМЕСТИТЬ и ReAllocate.Если буфер фиксированного, освобождение буфер метод помещает в буфер блокированных нулевой длины., Если буфер был освобожден выбрать с резервным диспетчером, использует диспетчер CFixedStringMgr резервного копирования, чтобы освободить его.

Реализация CFixedStringMgr::Clone

Сама CFixedStringMgr::Clone реализация всегда возвращает указатель на него резервной копии, а не CFixedStringMgr.Это происходит потому, что каждый экземпляр CFixedStringMgr можно только связаны с единственным экземпляром класса CStringT.Все остальные экземпляры должны клонировать диспетчер CStringT при попытке получить резервный диспетчер.Это происходит потому, что подвергаемый общим поддержки диспетчера резервного копирования.

Реализация CFixedStringMgr::GetNilString

Реализация CFixedStringMgr::GetNilString возвращает фиксированный буфер.В результате отдельной соответствие CFixedStringMgr и CStringT, заданный экземпляр CStringT никогда не используется несколько буфер за раз.Поэтому строка nil и реальный буфер строк никогда не требуются одновременно.

При фиксированной буфер не используются, CFixedStringMgr гарантирует, что она инициализирована с нулевой длиной.Это позволяет его для использования в виде строки nil.Например, добавленная bonus участник nAllocLength буфера фиксированного всегда устанавливается на величине фиксированного буфера.Это означает, что CStringT может расти строку без вызова IAtlStringMgr::Reallocate, даже для строки nil.

Требования

Header: cstringt.h

См. также

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

Управление памятью для CStringT