Share via


CFixedStringT: 사용자 지정 문자열 관리자의 예

ATL 라이브러리는 CFixedStringMgr이라는 클래스 CFixedStringT에서 사용하는 사용자 지정 문자열 관리자의 한 가지 예를 구현합니다. CFixedStringT는 CStringT에서 파생되며 문자열이 템플릿 매개 변수에 지정된 길이보다 작으면 해당 문자 데이터를 개체 자체의 CFixedStringTCFixedStringT 일부로 할당하는 문자열을 t_nChars 구현합니다. 이 방법을 사용하면 문자열 길이가 고정 버퍼의 크기를 초과하지 않는 한 문자열에 힙이 전혀 필요하지 않습니다. CFixedStringT 항상 힙을 사용하여 문자열 데이터를 할당하는 것은 아니므로 문자열 관리자로 사용할 CAtlStringMgr 수 없습니다. IAtlStringMgr 인터페이스를 구현하는 사용자 지정 문자열 관리자(CFixedStringMgr)를 사용합니다. 이 인터페이스는 사용자 지정 문자열 관리자 구현(고급 메서드)에서 설명합니다.

생성자는 CFixedStringMgr 다음 세 개의 매개 변수를 사용합니다.

  • pData: 사용할 고정 CStringData 구조체에 대한 포인터입니다.

  • nChars: 구조체가 보유할 수 있는 CStringData 최대 문자 수입니다.

  • pMgr: "백업 문자열 관리자"의 인터페이스에 대한 포인터 IAtlStringMgr 입니다.

생성자는 pDatapMgr값을 해당 멤버 변수(m_pDatam_pMgr)에 저장합니다. 그런 다음 버퍼의 길이를 0으로 설정하고, 사용 가능한 길이는 고정 버퍼의 최대 크기와 같고, 참조 수는 -1로 설정합니다. 참조 개수 값은 버퍼가 잠겨 있고 이 인스턴스 CFixedStringMgr 를 문자열 관리자로 사용했음을 나타냅니다.

버퍼를 잠긴 것으로 표시하면 다른 CStringT 인스턴스가 버퍼에 대한 공유 참조를 보유하지 못하게 됩니다. 다른 CStringT 인스턴스가 버퍼를 공유하도록 허용된 경우 다른 문자열이 버퍼를 사용하는 동안 포함된 CFixedStringT 버퍼를 삭제할 수 있습니다.

CFixedStringMgr 는 인터페이스의 전체 구현입니다 IAtlStringMgr . 각 메서드의 구현은 별도로 설명됩니다.

CFixedStringMgr::Allocate 구현

문자열의 CFixedStringMgr::Allocate 요청된 크기가 고정 버퍼의 크기(멤버에 m_pData 저장됨)보다 작거나 같은지 확인하기 위한 첫 번째 검사 구현입니다. 고정 버퍼가 충분히 CFixedStringMgr 큰 경우 길이가 0인 고정 버퍼를 잠깁니다. 문자열 길이가 고정 버퍼의 크기를 초과하지 않는 한 버퍼 CStringT 를 다시 할당할 필요가 없습니다.

요청된 문자열 크기가 고정 버퍼 CFixedStringMgr 보다 크면 백업 문자열 관리자에게 요청을 전달합니다. 백업 문자열 관리자는 힙에서 버퍼를 할당하는 것으로 추정됩니다. 그러나 이 버퍼를 반환하기 전에 버퍼 CFixedStringMgr 를 잠그고 버퍼의 문자열 관리자 포인터를 개체에 CFixedStringMgr 대한 포인터로 바꿉니다. 이렇게 하면 버퍼 CStringT 를 다시 할당하거나 해제하려는 시도가 호출 CFixedStringMgr됩니다.

CFixedStringMgr::ReAllocate 구현

구현은 .의 CFixedStringMgr::ReAllocate 구현과 매우 유사합니다 Allocate.

다시 할당되는 버퍼가 고정 버퍼이고 요청된 버퍼 크기가 고정 버퍼보다 작은 경우 할당이 수행되지 않습니다. 그러나 다시 할당되는 버퍼가 고정 버퍼가 아닌 경우 백업 관리자와 함께 할당된 버퍼여야 합니다. 이 경우 백업 관리자는 버퍼를 다시 할당하는 데 사용됩니다.

다시 할당되는 버퍼가 고정 버퍼이고 새 버퍼 크기가 너무 커서 고정 버퍼 CFixedStringMgr 내에 맞지 않는 경우 백업 관리자를 사용하여 새 버퍼를 할당합니다. 그런 다음 고정 버퍼의 내용이 새 버퍼에 복사됩니다.

CFixedStringMgr::Free 구현

구현 CFixedStringMgr::Free 은 다음과 같은 패턴을 AllocateReAllocate따릅니다. 해제되는 버퍼가 고정 버퍼인 경우 메서드는 이 버퍼를 길이가 0인 잠긴 버퍼로 설정합니다. 해제되는 버퍼가 백업 관리자 CFixedStringMgr 와 함께 할당된 경우 백업 관리자를 사용하여 해제합니다.

CFixedStringMgr::Clone 구현

구현 CFixedStringMgr::Clone 은 항상 자체 대신 백업 관리자에 대한 포인터를 반환합니다 CFixedStringMgr . 이 문제는 모든 인스턴스를 CFixedStringMgr 단일 CStringT인스턴스와만 연결할 수 있기 때문에 발생합니다. 관리자를 CStringT 복제하려는 다른 인스턴스는 백업 관리자를 대신 가져와야 합니다. 백업 관리자가 공유되는 것을 지원하기 때문입니다.

CFixedStringMgr::GetNilString 구현

고정 버퍼를 CFixedStringMgr::GetNilString 반환하는 구현입니다. 일대일 대응 CFixedStringMgr 으로 CStringT인해 지정된 인스턴스 CStringT 는 한 번에 둘 이상의 버퍼를 사용하지 않습니다. 따라서 nil 문자열과 실제 문자열 버퍼는 동시에 필요하지 않습니다.

고정 버퍼를 사용하지 CFixedStringMgr 않을 때마다 길이가 0으로 초기화되었는지 확인합니다. 이를 통해 nil 문자열로 사용할 수 있습니다. 추가 보너스로 고정 nAllocLength 버퍼의 멤버는 항상 고정 버퍼의 전체 크기로 설정됩니다. 즉CStringT, Nil 문자열에 대해서도 IAtlStringMgr::Reallocate를 호출하지 않고 문자열을 늘릴 수 있습니다.

요구 사항

헤더: cstringt.h

참고 항목

CStringT를 사용한 메모리 관리