2012-06-18 2 views
0

내 응용 프로그램에서 몇 가지 유니 코드 문자열 (< 10)을 관리해야합니다. 이 문자열의 내용은 동적이며 응용 프로그램 실행을 통해 변경할 수 있습니다. 문자열을 저장하려면 UnicodeString 유형의 객체를 사용하고 있습니다.유니 코드 문자열 저장 유형

UnicodeString str1; 

UnicodeString str2; 

... 

UnicodeString strN; 

이 솔루션은 적어도 언뜻 보면 매우 간단하다 :이 문제를 해결하는

한 가지 방법은 예를 들어 같은 유니 코드 문자열이있는만큼 멤버 변수를 만드는 것입니다. 그러나 확장성에 문제가 있습니다. 미래에 문자열의 수가 증가한다면 우리는 읽기 어려운 큰 코드를 만들 위험이 있습니다. 그래서 나는 문자열 관리를 위해 이와 같은 것을 만들 수 있습니다 :

std::map<HWND, UnicodeString> file_names; ///< member variable of form TForm1 

모든 문자열은 일부 편집 상자와 연결됩니다. 사전에 키 핸들로 창 핸들을 사용할 수 있습니다.

이 경우 유니 코드 문자열을 저장하기위한 공간을 할당하고 할당을 해제해야하는 사람은 누구입니까?

void TForm1::ProcessFile(TEdit *edit_box) 
{ 
    UnicodeString str = "C:\\Temp\\ws.gdb"; 

    file_name[edit_box->Handle] = str; 
} 

STR 변수의 내용에는 processFile 멤버 함수 의 끝을 살아남을 것인가 : 나는 지역 스택에 유니 코드 스트링 변수를 만들 말할 수?

답변

1

UnicodeString의 메모리 저장소는 참조 계산되며 RTL에 의해 관리됩니다. new 연산자를 사용하여 UnicodeString 그 자체를 할당하지 않는 한 직접 할당 해제에 대해 걱정할 필요가 없습니다. 코드 스 니펫에서는 ProcessFile()이 종료 될 때 str 변수가 해제되지만 file_name에는 여전히 활성 참조가 있기 때문에 내용이 살아납니다.

std::map의 키로 HWND을 사용하지 마십시오. TWinControl::Handle 속성에 의해 관리되는 창은 동적이며 응용 프로그램의 수명 동안 값을 변경할 수 있습니다. 대신 TEdit* 포인터를 사용할 수 있습니다.

std::map<TEdit*, UnicodeString> file_names; 

void TForm1::ProcessFile(TEdit *edit_box) 
{ 
    UnicodeString str = "C:\\Temp\\ws.gdb"; 
    file_names[edit_box] = str; 
}