0

この質問は前に尋ねられるかもしれませんが、必要なものを正確に見つけることができませんでした。

私の問題は、Web サービスからダウンロードしたデータによってバッファがロードされていることです。バッファは末尾に「\0」がない unsigned char* 形式です。次に、poco xml パーサーに文字列が必要です。

文字列 valgrind に割り当ててみましたが、失われたデータが見つかりました。(下記参照)

コードは次のとおりです。

DOMParser::DOMParser(unsigned char* consatData, int consatDataSize,
    unsigned char* lagData, int lagDataSize) {

Poco::XML::DOMParser parser;
std::string consat;
consat.assign((const char*) consatData, consatDataSize);
pDoc = parser.parseString(consat);
ParseConsat();
}

Poco xml パーサーには、const char* とデータのサイズを必要とする ParseMemory がありますが、何らかの理由でセグメンテーション エラーが発生します。

更新: これは valgrind の結果の一部です:

==11880== 12,272 bytes in 1 blocks are possibly lost in loss record 1,126 of 1,143
==11880==    at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==11880==    by 0x4491D05: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc+$
==11880==    by 0x4493F6F: std::string::_M_mutate(unsigned int, unsigned int, unsigned int) (in /usr/lib/libstdc++.so.6.0.13)
==11880==    by 0x4494109: std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) (in /usr/lib/libstdc++.$
==11880==    by 0x44941AD: std::string::assign(char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.13)
==11880==    by 0x804DE03: DOMParser::DOMParser(unsigned char*, int, unsigned char*, int) (DOMParser.cpp:27)
4

2 に答える 2

1

私の質問は、null で終了していないデータを文字列に取得する方法です。

次のように、適切なstd::stringコンストラクターを使用します。

std::string( (const char*) consatData, consatDataSize);

ほぼ同等に、次の.assign()メソッドを使用します。

std::string consat;
consat.assign((const char*) consatData, consatDataSize);

水漏れなどのトラブルの原因になることがわかりました。

あなたは間違って認識しています。文字列データが文字列にコピーされます。漏れはありません。

注: 「C スタイルのキャストを使用しないでください!」と言う人がいるかもしれませんが、おそらくそのとおりです。おそらくreinterpret_cast<const char*>(consatData)代わりに使用する必要があります。C スタイルのキャストはそのままにしておきます。これは、それらが機能し、元のコードで使用されているためです。

于 2012-10-15T21:51:52.123 に答える
0

ここには 2 つの問題があります。まず、バッファが null で終了していません。第二に、それunsigned charは標準ではなくのcharです。

が指し示す記憶はどこconsatDataから来るのか? Web サービスからデータを読み取る前に割り当てますか、それとも Web サービスが割り当てますか? また、consatDataSizeバッファのサイズですか、それとも Web サービスによって読み取られるバイト数ですか?

最後に null ターミネータを自分で追加する余地があるようにバッファを割り当てることができるかどうかを確認してください。バッファーの大きさを制御する場合 (つまり、自分で割り当てて Web サービスに書き込みを要求する場合)、追加のバイトを割り当てて、Web サービスからバイト数が通知されたら null を書き込みます。書いた。それ以外の場合、サービスが独自の char バッファーを null で終了しないとは想像できません...おそらく、十分なストレージを提供していませんか?

次に、文字列に変換するには、この StackOverflow スレッドに従います。少なくとも 2 つの解決策が提案されています。std::stringunsigned char を含む を作成する (互換性の問題が発生する可能性があります) か、 unsigned char を signed char にキャストしてプレーンの jane を作成しますstd::string

于 2012-10-15T21:33:49.553 に答える