wchar_t指针

时间:2010-06-24 17:33:17

标签: c++ pointers arrays

这有什么问题:

wchar_t * t = new wchar_t;

t = "Tony";

我以为我可以使用wchar_t指针作为字符串......

6 个答案:

答案 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