QStringList转char*数组赋值异常:部分值乱码求助
问题根源
你这段代码的核心问题是临时对象销毁导致野指针:ListaElementiRiga.at(...).toStdString()返回的是临时std::string对象,语句执行完毕后这个临时对象就会被销毁,而c_str()返回的指针指向的是该临时对象的内部缓冲区。后续访问这个指针时,内存要么已被释放,要么被其他数据覆盖,就会出现乱码;偶尔正常只是巧合(内存还没被改写)。
解决方案
方案1:手动分配内存复制字符串
通过手动分配内存并复制字符串内容,让指针指向自己管理的内存,避免临时对象销毁带来的问题:
// 先释放之前的内存(避免内存泄漏) for (int i = 0; i < 16; ++i) { if (MyparamValuesTagliando[i] != nullptr) { free(MyparamValuesTagliando[i]); MyparamValuesTagliando[i] = nullptr; } } // 逐个转换并复制 MyparamValuesTagliando[2] = strdup(ListaElementiRiga.at(Destinatario).toUtf8().constData()); MyparamValuesTagliando[3] = strdup(ListaElementiRiga.at(Toponimo).toUtf8().constData()); MyparamValuesTagliando[4] = strdup(ListaElementiRiga.at(Civico).toUtf8().constData()); MyparamValuesTagliando[5] = strdup(ListaElementiRiga.at(Comune).toUtf8().constData()); MyparamValuesTagliando[6] = strdup(ListaElementiRiga.at(Provincia).toUtf8().constData()); MyparamValuesTagliando[7] = strdup(ListaElementiRiga.at(Cap).toUtf8().constData());
注意:
strdup会自动分配内存,后续一定要用free()释放这些内存。如果不想用strdup,也可以用malloc+strcpy实现:QString tempStr = ListaElementiRiga.at(Destinatario); QByteArray byteArr = tempStr.toUtf8(); MyparamValuesTagliando[2] = (char*)malloc(byteArr.size() + 1); strcpy(MyparamValuesTagliando[2], byteArr.constData());
方案2:用QByteArray保存缓冲区(自动管理内存)
创建一个QByteArray数组保存转换后的字节缓冲区,利用QByteArray自动管理内存的特性,确保指针始终有效:
// 定义对应缓冲区数组,生命周期需与MyparamValuesTagliando一致 QByteArray MyparamBuffers[16]; // 先将QString转成QByteArray保存,再取指针 MyparamBuffers[2] = ListaElementiRiga.at(Destinatario).toUtf8(); MyparamValuesTagliando[2] = MyparamBuffers[2].constData(); MyparamBuffers[3] = ListaElementiRiga.at(Toponimo).toUtf8(); MyparamValuesTagliando[3] = MyparamBuffers[3].constData(); MyparamBuffers[4] = ListaElementiRiga.at(Civico).toUtf8(); MyparamValuesTagliando[4] = MyparamBuffers[4].constData(); // 剩余元素按同样方式处理
这种方法无需手动释放内存,只要MyparamBuffers的生命周期不短于MyparamValuesTagliando即可。
编码注意事项
如果你的文本文件使用本地编码(如GBK),可将toUtf8()替换为toLocal8Bit(),根据实际编码情况选择转换方式。
内容的提问来源于stack exchange,提问作者giocap58
相关产品推荐
相关产品推荐

