假设我有这个:
LPTSTR MyString = _T("A string");
void SomeFunction(LPCWSTR param);
我可以使用ATL conversion macros,
CT2CW
之一,并且该函数按预期工作:SomeFunction(CT2CW(MyString));
但是,如果我有这样的事情:
LPWSTR WString = CT2CW(MyString); // or CT2W, it doesn't matter
现在,
WString
不包含我所期望的;它似乎包含垃圾。我确信这是一些时髦的指针事务,但是我很沮丧。 最佳答案
销毁CT2CW
对象时,将释放用于存储字符串的内存。
实际上,您链接到的MSDN页面已经提到了这个确切的问题。
在SomeFunction(CT2CW(MyString));
中,直到执行包括函数调用在内的整个语句之前,临时CT2CW
对象才被销毁-请参见"Life span of temporary arguments?"。
在LPWSTR WString = CT2CW(MyString);
中,执行整个语句后,临时CT2CW
对象将被销毁。这意味着执行该语句后,WString
指向已释放的内存。
正如您链接到的MSDN文章中已经提到的,解决方案是使用局部变量而不是临时对象:
CT2CW WString(MyString);
局部变量直到其作用域结束时才会销毁。