Share via


사용자 지정 문자열 관리자 구현(고급 방법)

특수한 상황에서는 메모리를 할당하는 데 사용되는 힙을 변경하는 것 이상의 작업을 수행하는 사용자 지정 문자열 관리자를 구현할 수 있습니다. 이 경우 IAtlStringMgr 인터페이스를 사용자 지정 문자열 관리자로 수동으로 구현해야 합니다.

이렇게 하려면 먼저 CStringT에서 해당 인터페이스를 사용하여 문자열 데이터를 관리하는 방법을 이해하는 것이 중요합니다. 모든 인스턴스 CStringT 에는 CStringData 구조체에 대한 포인터가 있습니다. 이 가변 길이 구조에는 문자열에 대한 중요한 정보(예: 길이)와 문자열의 실제 문자 데이터가 포함됩니다. 모든 사용자 지정 문자열 관리자는 요청 CStringT시 이러한 구조를 할당하고 해제해야 합니다.

구조체는 CStringData 다음 네 개의 필드로 구성됩니다.

  • pStringMgr 이 필드는 이 문자열 데이터를 관리하는 데 사용되는 인터페이스를 가리킵니 IAtlStringMgr 다. 문자열 버퍼를 다시 할당하거나 해제해야 하는 경우 CStringT 이 인터페이스의 Reallocate 또는 Free 메서드를 호출하여 구조를 매개 변수로 전달 CStringData 합니다. 문자열 관리자에서 구조를 할당할 CStringData 때 사용자 지정 문자열 관리자를 가리키도록 이 필드를 설정해야 합니다.

  • nDataLength 이 필드에는 종료 null을 제외한 버퍼에 저장된 문자열의 현재 논리 길이가 포함됩니다. CStringT 는 문자열 길이가 변경되면 이 필드를 업데이트합니다. 구조를 할당할 CStringData 때 문자열 관리자는 이 필드를 0으로 설정해야 합니다. 구조를 다시 할당할 CStringData 때 사용자 지정 문자열 관리자는 이 필드를 변경하지 않은 상태로 유지해야 합니다.

  • nAllocLength 이 필드에는 다시 할당하지 않고 이 문자열 버퍼에 저장할 수 있는 최대 문자 수(종료 null 제외)가 포함됩니다. 문자열의 논리적 길이를 늘려야 할 때마다 CStringT 먼저 이 필드를 검사 버퍼에 충분한 공간이 있는지 확인합니다. 검사 실패 CStringT 하면 사용자 지정 문자열 관리자를 호출하여 버퍼를 다시 할당합니다. 구조를 할당하거나 다시 할당할 CStringData 때 이 필드를 nChars 매개 변수에서 요청된 문자 수 이상으로 IAtlStringMgr::Allocate 또는 IAtlStringMgr::Reallocate로 설정해야 합니다. 버퍼에 요청된 것보다 더 많은 공간이 있는 경우 사용 가능한 실제 공간을 반영하도록 이 값을 설정할 수 있습니다. 이렇게 하면 CStringT 버퍼를 다시 할당하기 위해 문자열 관리자로 다시 호출하기 전에 할당된 전체 공간을 채우기 위해 문자열을 늘릴 수 있습니다.

  • nRefs 이 필드에는 문자열 버퍼의 현재 참조 수가 포함됩니다. 값이 하나이면 단일 인스턴스 CStringT 가 버퍼를 사용합니다. 또한 인스턴스는 버퍼의 내용을 읽고 수정할 수 있습니다. 값이 1보다 크면 여러 인스턴스에서 CStringT 버퍼를 사용할 수 있습니다. 문자 버퍼는 공유 CStringT 되므로 인스턴스는 버퍼의 내용만 읽을 수 있습니다. 콘텐츠를 CStringT 수정하려면 먼저 버퍼의 복사본을 만듭니다. 값이 음수이면 하나의 인스턴스 CStringT 만 버퍼를 사용합니다. 이 경우 버퍼는 잠긴 것으로 간주됩니다. 인스턴스가 CStringT 잠긴 버퍼를 사용하는 경우 다른 인스턴스는 버퍼를 CStringT 공유할 수 없습니다. 대신 이러한 인스턴스는 콘텐츠를 조작하기 전에 버퍼의 복사본을 만듭니다. 또한 CStringT 잠긴 버퍼를 사용하는 인스턴스는 할당된 다른 CStringT 인스턴스의 버퍼를 공유하려고 시도하지 않습니다. 이 경우 인스턴스는 CStringT 다른 문자열을 잠긴 버퍼에 복사합니다.

    구조를 할당할 CStringData 때 버퍼에 허용되는 공유 유형을 반영하도록 이 필드를 설정해야 합니다. 대부분의 구현에서는 이 값을 1로 설정합니다. 이렇게 하면 일반적인 쓰기 복사 공유 동작이 허용됩니다. 그러나 문자열 관리자가 문자열 버퍼 공유를 지원하지 않는 경우 이 필드를 잠긴 상태로 설정합니다. 이렇게 하면 CStringT 할당된 인스턴스 CStringT 에만 이 버퍼를 사용합니다.

참고 항목

CStringT를 사용한 메모리 관리