详细说明:
我正在使用这个github项目将Json转换为对象。
https://github.com/ereilin/qt-json
有了这个json:
{
"bin": "/home/pablo/milaoserver/compile/Devices01.olk",
"temp":"/home/pablo/milaoserver/temporal/",
"port": "1234",
"name": "lekta",
}
用这两行我创建两个char指针:
char* bin = configuration["bin"].toString().toLatin1().data();
char* temp = configuration["temp"].toString().toLatin1().data();
调试应用程序我有正确的字符串。
然而,当我使用它们时,具体地说“bin”字符变为
`hom
任何想法?
评论中的解决方案:
问题在于数据的“持久性”。
我找到了解决方案:
std::string binAux(configuration["bin"].toString().toLatin1().data());
std::string tempAux(configuration["temp"].toString().toLatin1().data());
char* bin = new char[binAux.size()+1] ;
strcpy(bin, binAux.c_str());
char* temp = new char[tempAux.size()+1] ;
strcpy(temp, tempAux.c_str());
答案 0 :(得分:3)
这里的错误是因为临时对象。
toString()
在分号后创建一个不再可用的临时对象。
标准状态:
12.2临时对象[class.temporary]
3 / [...] 临时对象作为评估全表达式(1.9)的最后一步被销毁,它(词法上)包含创建它们的点。即使该评估以抛出异常结束,也是如此。销毁临时对象的值计算和副作用仅与完整表达式相关联,而不与任何特定子表达式相关联。
也就是说,当您想要访问它时,您有未定义的行为。
这可以解决您的问题:
QString str = configuration["bin"].toString().toLatin1();
QByteArray ba = str1.toLatin1();
char *bin = ba.data();
但是你想用char*
做什么?您使用的是C ++,请使用std::string
或Qstring
代替:
#include <string>
std::string bin(configuration["bin"].toString().toLatin1().data());
答案 1 :(得分:0)
你可以试试像
这样的东西std::string sbin(configuration["bin"].toString().toLatin1().data());
std::string sTemp(configuration["temp"].toString().toLatin1().data());
答案 2 :(得分:0)
toString()
创建一个立即删除的QString
对象,因此将释放其中包含的数据。我建议您将数据存储在QString
中,直到您使用char* bin
。
答案 3 :(得分:0)
您的解决方案可能更短,如下所示:
char* bin = strdup(configuration["bin"].toString().toLatin1().data().c_str());
char* temp = strdup(configuration["temp"].toString().toLatin1().data().c_str());
strdup()
几乎可以完成所有工作。