2013-08-23 2 views
1

Подробности:Почему мой символ * меняется без причины?

Im, используя этот проект 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* bin = configuration["bin"].toString().toLatin1().data(); 
char* temp = configuration["temp"].toString().toLatin1().data(); 

Отладка приложения У меня есть соответствующие строки.

Однако, когда я использую их, конкретно в «БИН» символьные изменения

`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

Возможно ли, что 'toString' создает временную строку, которая не существует, после завершения строки? –

+0

Правильно ли значение 'temp' отображается? – lurker

+0

Temp существует правильно. И ящик тоже. Но когда я «использую» их, меняются только бины: S –

ответ

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()); 
+0

С вами все в порядке. Спасибо. Я не могу доверять вам положительным. –

+0

Я хочу использовать char *, потому что я интегрирую C-библиотеку, которая требует char * Это проблема. Сила изменить старые кодеры на самом деле очень сложно. Я видел «уродливый код старых людей», который вы не можете себе представить: P –

0

Можете ли вы попробовать что-то вроде

std::string sbin(configuration["bin"].toString().toLatin1().data()); 
std::string sTemp(configuration["temp"].toString().toLatin1().data()); 
+0

С вами все в порядке. Спасибо. Я не могу доверять вам положительным. –

0

toString() создает QString объект, который удаляется сразу, так что данные, содержащиеся в нем будет быть освобожденным. Я рекомендую хранить данные в QString, пока вы не воспользуетесь этим char* bin.

0

Ваше решение может быть короче, например:

char* bin = strdup(configuration["bin"].toString().toLatin1().data().c_str()); 
char* temp = strdup(configuration["temp"].toString().toLatin1().data().c_str()); 

strdup() делает практически все, что вы делаете.