为什么我的char *没有理由改变?

时间:2013-08-23 11:07:12

标签: c++ json qt

详细说明:

我正在使用这个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());

4 个答案:

答案 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::stringQstring代替:

#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()几乎可以完成所有工作。