【发布时间】:2012-11-04 12:06:45
【问题描述】:
我对 C 字符串和宽 C 字符串有点困惑。为了这个问题,假设我使用 Microsoft Visual Studio 2010 Professional。如果我的任何信息不正确,请告诉我。
我有一个带有 const wchar_t* 成员的结构,用于存储名称。
struct A
{
const wchar_t* name;
};
当我这样为对象“a”分配名称时:
int main()
{
A a;
const wchar_t* w_name = L"Tom";
a.name = w_name;
return 0;
}
这只是将 w_name 指向的内存地址复制到 a.name 中。现在 w_name 和 a.name 都是指向内存中相同地址的宽字符指针。
如果我是正确的,那么我想知道如何处理这种情况。我正在使用 tinyxml2 从 XML 属性中读取 C 字符串。
tinyxml2::XMLElement* pElement;
// ...
const char* name = pElement->Attribute("name");
获得 C 字符串后,我将其转换为宽字符串,如下所示:
size_t newsize = strlen(name) + 1;
wchar_t * wcName = new wchar_t[newsize];
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, wcName, newsize, name, _TRUNCATE);
a.name = wcName;
delete[] wcName;
如果到目前为止我是正确的,那么行:
a.name = wcName;
只是将数组 wcName 的第一个字符的内存地址复制到 a.name 中。但是,我在分配此指针后直接删除 wcName,这将使其指向垃圾。
如何将我的 C 字符串转换为宽字符 C 字符串,然后将其分配给 a.name?
【问题讨论】:
-
为什么要删除 wcName?如果重点是转换为 wchar_t,那么为什么要删除保存转换结果的新分配内存?
-
发布的代码有问题。似乎没有删除它的理想位置。我想过添加一个 ~A() 析构函数来删除它,但出于某种原因,这对我来说真的很难看。
-
@user974967 (析构函数)精确地在您可以删除它的位置(或者在您需要重新分配它的任何时候,但我建议尝试重用缓冲区,如果新任务仍然合适。