UnicodeString存储类型

时间:2012-06-18 14:47:27

标签: memory-management unicode-string c++builder-xe

我的应用程序需要管理一些unicode字符串(< 10)。这些字符串的内容是动态的,可以通过应用程序运行进行更改。要存储字符串,我使用的是UnicodeString类型的对象。

解决此问题的一种方法是创建与unicode字符串一样多的成员变量,例如:

UnicodeString str1;

UnicodeString str2;

...

UnicodeString strN;

这种解决方案至少乍一看非常简单。但是可扩展性存在问题。如果将来字符串的数量会增加,我们就有可能创建难以阅读的bigg代码。所以我想创建这样的东西来管理字符串:

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

每个字符串都与某个编辑框相关联。我可以使用窗口句柄作为字典的关键。

我不明白 - 在这种情况下,谁应该负责分配和释放用于存储unicode字符串的空间?假设我在本地堆栈上创建了UnicodeString变量:

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

    file_name[edit_box->Handle] = str;
}

str 变量的内容是否会在成员函数 ProcessFile 结束时生效?

1 个答案:

答案 0 :(得分:1)

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;
}