0

私のアプリケーションは、いくつかの Unicode 文字列 (<10) を管理する必要があります。これらの文字列の内容は動的であり、アプリケーションの実行によって変化する可能性があります。文字列を格納するために、UnicodeString 型のオブジェクトを使用しています。

この問題を解決する 1 つの方法は、次のような Unicode 文字列と同じ数のメンバー変数を作成することです。

UnicodeString str1;

UnicodeString str2;

...

UnicodeString strN;

このソリューションは、少なくとも一見すると非常に単純です。しかし、スケーラビリティに問題があります。将来、文字列の数が増えると、読みにくい大きなコードが作成されるリスクがあります。したがって、文字列を管理するために次のようなものを作成することを考えました。

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

すべての文字列は、いくつかの編集ボックスに接続されています。ウィンドウ ハンドルを辞書のキーとして使用できます。

私が理解していないこと - この場合、ユニコード文字列を格納するためのスペースの割り当てと割り当て解除を担当するのは誰ですか? ローカル スタックに UnicodeString 変数を作成するとします。

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

    file_name[edit_box->Handle] = str;
}

str変数の内容は、メンバー関数ProcessFileの終了後も存続しますか?

4

1 に答える 1

1

a のメモリ ストレージUnicodeStringは参照カウントされ、RTL によって管理されます。演算子UnicodeStringを使用してそれ自体を割り当てない限り、自分で割り当てを解除することを心配する必要はありません。newコード スニペットでは、str変数は終了時に解放されますが、変数へのアクティブな参照がまだあるProcessFile()ため、その内容は存続します。file_name

HWNDのキーとして を使用しないでくださいstd::map。プロパティによって管理されるウィンドウ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;
}
于 2012-06-19T04:34:49.403 に答える