我的应用程序需要管理一些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 结束时生效?
答案 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;
}