这有什么问题:
wchar_t * t = new wchar_t;
t = "Tony";
我以为我可以使用wchar_t指针作为字符串......
答案 0 :(得分:27)
您的代码有两个问题。
首先,"Tony"
是指向char
字符串的指针。 L"Tony"
是适当的宽字符串。
其次,你通过new分配一个wchar_t
,然后通过将指针重新分配给Tony立即失去对它的跟踪。这会导致内存泄漏。
答案 1 :(得分:11)
指针只指向一个值。这很重要。
您所做的一切都为单个wchar_t
分配了空间,并指向它。然后你尝试将指针设置为指向一个字符串(记住,只是在第一个字符处),但字符串类型不正确。
你拥有的是一串char
,它应该是L"Tony"
。但是你在这里所做的就是泄漏你以前的内存分配,因为指针保存了一个新值。
而是要分配足够的空间来容纳整个字符串,然后将字符串复制到分配的内存中。但这是一种可怕的做法;永远不要做任何让你需要明确释放记忆的事情。
只需使用std::wstring
然后继续。 std::wstring t = L"Tony";
。它处理所有细节,您无需担心清理任何细节。
答案 2 :(得分:6)
由于您是C#开发人员,我将指出c ++的不同之处。
这会分配一个新的wchar_t并将其分配给t
wchar_t* t = new wchar_t
这是一个常量字符数组
"Tony"
使用L
获取常量wchar_t数组前缀L"Tony"
这将重新指向t指向常量L“Tony”而不是旧的wchar_t并导致内存泄漏,因为wchar_t永远不会被释放。
t = L"Tony"
这会创建一个宽字符串(wchar_t)来保存L“Tony”的副本
std::wstring t = L"Tony"
我认为最后一行是你想要的。如果需要访问wchar_t指针,请使用t.c_str()。请注意,c ++字符串是可变的,并在每个赋值中复制。
这样做的方法是
const wchar_t* t = L"Tony"
这不会创建副本,只会指定指向const wchar数组的指针
答案 3 :(得分:5)
这样做首先将指向新分配的wchar_t
的指针分配到t
,然后尝试将非宽字符串分配到t
。
您可以使用std::wstring
吗?这将满足您的所有内存管理需求。
答案 4 :(得分:0)
你可以,它只是“Tony”是一个硬编码字符串,并且在大多数编辑器/编译器中它们默认为ANSI。如果您想告诉编辑器您输入的是Unicode字符串,请在其前面添加L,例如: t = L"Tony"
。
你的代码有其他问题,你的分配是分配一个Unicode字符(2个字节),然后你试图将原始变量指向常量字符串,从而泄漏这2个字节。
如果要创建Unicode数据缓冲区并将数据放入其中,您需要执行以下操作:
wchar_t* t = new wchar_t[500];
wcscpy(t, "Tony");
答案 5 :(得分:-1)
这是完全错误的。 不需要分配两个字节,使t指向它们,然后覆盖指针t永远泄漏丢失的内存。
另外,“Tony”有不同的类型。使用:
wchar_t *t = L"Tony";
恕我直言,最好不要使用wchars - 请参阅https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful