作为一个由于业务要求,不得不兼职qt的前端崽,今天差点没被c++的c_str()坑死,记录做个纪念。
最近通过c++写了个dll,作为项目的质量统计上报,需要接入qt,为什么不直接在qt里写呢,原因很简单,后面我还得编译wasm版本给js调用,还有可能还要编辑android和ios的版本。
前面呢一切进展很顺利,但是但我需要把QString的值转成const char* 传入dll使用时,发现字符串乱码了,关键是字符串还是英文的。
一开始觉得是编码问题,查了老半天没能解决,然后随手把传入的内容从QString改成一个const char*定义的变量时,发现没出现乱码,大概如下
// QString a("this word error");
// dllFunction(a.toStdString().c_str());
dllFunction("this word right");
之后一点点排查,终于发现是在c_str时发生的问题,大致如下
// std::string a = "error too";
// dllFunction(a.c_str());
const char* a = "this word right";
dllFunction(a);
最后google找到了解决方法,代码如下
std::string a = "this word right";
dllFunction(strdup(a.c_str()));
按照大佬说的原因是
原因:s.c_str()返回的是垃圾指针,s已经被析构,所以会乱码
将代码改成如下便正常了
dllFunction(strdup(qStr.toStdString().c_str()));