Windows平台下QString转PCWSTR:为何两段相似代码运行结果不同?
为啥第一段代码能正常工作,第二段却不行?
这个问题本质是C++里临时对象生命周期的经典陷阱,我给你拆解清楚:
先看能正常运行的代码:
QString username = "Bond"; std::wstring username_w = username.toStdWString(); PCWSTR username_p = username_w.c_str();
这里的username_w是一个有名字的局部变量,它的生命周期和当前代码块(比如所在的函数、if分支)绑定——只要代码块没执行完,这个std::wstring对象就会一直存在,它内部存储的宽字符数组也不会被释放。所以c_str()返回的指针指向的是一块有效的内存,自然能正常使用。
再看出问题的代码:
QString username = "Bond"; PCWSTR username_p = username.toStdWString().c_str();
这里toStdWString()返回的是一个临时的std::wstring对象——它没有名字,是个“一次性”的对象。在C++里,这种临时对象的生命周期只到当前语句结束(也就是分号;的位置)。当语句执行完,这个临时的std::wstring就会被销毁,它内部的字符数组内存也会被系统回收。
这时候username_p就变成了一个悬垂指针——指向的是已经被释放的内存区域。后续使用这个指针的话,要么读到乱码,要么直接触发程序崩溃,完全不可靠。
额外小技巧:
如果不想多写一行变量声明,也可以用const引用来延长临时对象的生命周期:
QString username = "Bond"; const std::wstring& username_w = username.toStdWString(); PCWSTR username_p = username_w.c_str();
不过我还是更推荐用命名变量的写法,可读性更强,也不容易在后续修改代码时再踩类似的坑。
内容的提问来源于stack exchange,提问作者Jez
相关产品推荐
相关产品推荐

