wchar_t指针

Ton*_*ion 10 c++ arrays pointers

这有什么问题:

wchar_t * t = new wchar_t;

t = "Tony";
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ael 27

您的代码有两个问题.

首先,"Tony"是一个指向字符串的指针char. L"Tony"是适当的宽字符串.

其次,你wchar_t通过new 分配一个,然后通过重新指定Tony来立即失去对它的跟踪.这会导致内存泄漏.

  • 为了扩展Michael的解释,正确的语法是`wchar_t*t = L"Tony";`.这将声明一个指针并将其初始化为指向静态(宽)字符串"Tony". (4认同)
  • 语法应该是`wchar_t const*t = L"Tony";`.要了解原因,请考虑语句"*(t + 1)= L'i';` (3认同)

GMa*_*ckG 11

指针只指向一个值.这个很重要.

你所做的就是为单个人分配空间wchar_t,并指出它.然后尝试将指针设置为指向字符串(请记住,只是在第一个字符处),但字符串类型不正确.

你拥有的是一串char"应该" L"Tony".但是你在这里所做的就是泄漏你以前的内存分配,因为指针保存了一个新值.

而是想要分配足够的空间来容纳整个字符串,然后字符串复制到分配的内存中.但这是一种可怕的做法; 永远不要做任何让你需要明确释放内存的东西.

只需使用std::wstring并继续前进.std::wstring t = L"Tony";.它处理所有细节,您不必担心清理任何东西.

  • IMO最正确的答案,使用`std :: wstring`,最好的建议. (2认同)

jos*_*efx 6

既然你是C#开发人员,我会指出c ++做的一些不同的事情.

这会分配一个新的wchar_t并将其分配给t

wchar_t* t = new wchar_t
Run Code Online (Sandbox Code Playgroud)

这是一个常量char数组

"Tony" 
Run Code Online (Sandbox Code Playgroud)

要获得一个常量的wchar_t数组前缀,用L表示

L"Tony"
Run Code Online (Sandbox Code Playgroud)

这将重新指向t指向常量L"Tony"而不是旧的wchar_t并导致内存泄漏,因为wchar_t永远不会被释放.

t = L"Tony"
Run Code Online (Sandbox Code Playgroud)

这会创建一个宽字符串(wchar_t)来保存L"Tony"的副本

std::wstring t = L"Tony"
Run Code Online (Sandbox Code Playgroud)

我想最后一行是你想要的.如果需要访问wchar_t指针,请使用t.c_str().请注意,c ++字符串是可变的,并在每个赋值中复制.

这样做的方法是

const wchar_t* t = L"Tony"
Run Code Online (Sandbox Code Playgroud)

这不会创建副本,只会指定指向const wchar数组的指针


Mar*_*k B 5

这样做是首先指定一个指向新分配wchar_tt,然后尝试指派非宽字符串转换t.

你能用std::wstring吗?这将满足您的所有内存管理需求.

  • @Pavel:这是非常错误的.wstring是`typedef`'作为`basic_string <wchar_t>`并存在于*every*compatible C++ system/toolchain上. (6认同)
  • @Pavel:§21.2/ 2:"标题`<string>`还定义了两个特定的模板类`string`和`wstring`以及它们的特殊特征." (6认同)