1

詳細:

この 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",

}

この 2 行で、2 つの 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

4 に答える 4

3

ここでのエラーは、一時オブジェクトが原因です。

toString()セミコロンの後に使用できなくなった一時オブジェクトを作成します。

標準状態:

12.2 一時オブジェクト [class.temporary]

3/ [...]一時オブジェクトは、それらが作成されたポイントを (レキシカルに) 含む完全式 (1.9) を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。値の計算と一時オブジェクトの破棄の副作用は、特定の部分式ではなく、完全な式にのみ関連付けられます。

つまり、アクセスしたいときはUndefined Behaviorになります。

これで問題が解決するはずです:

QString str = configuration["bin"].toString().toLatin1();
QByteArray ba = str1.toLatin1();
char *bin = ba.data();

しかし、何を使いたいchar*ですか?あなたは C++ を使用しています。代わりにstd::stringorを使用してください:Qstring

#include <string>

std::string bin(configuration["bin"].toString().toLatin1().data());
于 2013-08-23T11:14:45.350 に答える
0

toString()すぐに削除されるオブジェクトを作成するQStringため、それに含まれるデータは解放されます。QStringそれを使用するまで、データを に保存することをお勧めしますchar* bin

于 2013-08-23T11:22:50.940 に答える
0

次のようなものを試してみてください

std::string sbin(configuration["bin"].toString().toLatin1().data());
std::string sTemp(configuration["temp"].toString().toLatin1().data());
于 2013-08-23T11:15:00.913 に答える
0

次のように、ソリューションを短くすることができます。

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

strdup()は、ほぼすべてのことを行います。

于 2013-08-23T11:32:33.023 に答える