Mic*_*ael 27
您的代码有两个问题.
首先,"Tony"是一个指向字符串的指针char. L"Tony"是适当的宽字符串.
其次,你wchar_t通过new 分配一个,然后通过重新指定Tony来立即失去对它的跟踪.这会导致内存泄漏.
GMa*_*ckG 11
指针只指向一个值.这个很重要.
你所做的就是为单个人分配空间wchar_t,并指出它.然后尝试将指针设置为指向字符串(请记住,只是在第一个字符处),但字符串类型不正确.
你拥有的是一串char"应该" L"Tony".但是你在这里所做的就是泄漏你以前的内存分配,因为指针保存了一个新值.
而是想要分配足够的空间来容纳整个字符串,然后将字符串复制到分配的内存中.但这是一种可怕的做法; 永远不要做任何让你需要明确释放内存的东西.
只需使用std::wstring并继续前进.std::wstring t = L"Tony";.它处理所有细节,您不必担心清理任何东西.
既然你是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数组的指针
这样做是首先指定一个指向新分配wchar_t到t,然后尝试指派非宽字符串转换t.
你能用std::wstring吗?这将满足您的所有内存管理需求.