0

假设我有这个:

LPTSTR MyString = _T("A string"); 
void SomeFunction(LPCWSTR param);

我可以使用其中一个ATL 转换宏, CT2CW,并且该函数按预期工作:

SomeFunction(CT2CW(MyString));

但是,如果我有这样的事情:

LPWSTR WString = CT2CW(MyString); // or CT2W, it doesn't matter

现在WString不包含我期望的内容;它似乎只是包含垃圾。我确信这是一些时髦的指针业务,但我很难过。

4

1 回答 1

3

CT2CW当对象被销毁时,用于存储字符串的内存被释放。

事实上,您链接到的 MSDN 页面已经提到了这个确切的问题。

在中,在整个语句(包括函数调用)执行之前SomeFunction(CT2CW(MyString));,临时对象不会被销毁 - 请参阅“临时参数的生命周期?” .CT2CW

LPWSTR WString = CT2CW(MyString);中,临时CT2CW对象在整个语句执行完毕后被销毁。这意味着在这条语句执行之后,WString指向已经被释放的内存。

正如您链接到的 MSDN 文章中已经提到的,解决方案是使用局部变量而不是临时对象:

CT2CW WString(MyString);

局部变量在其作用域结束之前不会被销毁。

于 2015-01-20T01:25:10.363 回答