0

私は地図を持っています

map<AnsiString, Foo*>

マップで値を検索しようとすると、から受け取った文字列を使用しTMemoryStreamて関数に送信しますFoo* GetFoo(AnsiString)。関数はイテレータを作成し、見つかったオブジェクトを返します。これはほとんどの場合正常に機能しますが、1つの関数では値を返しません。

ルックアップに使用するAnsiStringがFooID = FooID.SetLength(FooID.Length() - 1);どこにあるかを実行すると、それが機能し、正しい結果が返されます。FooIDストリームにゴミがあるのではないかと思っていたのですが、箱から出してすぐに使える場所とハックが必要な場所で使われているAnsiStringsを見ると同じです!?

これは、IDEのデバッグ値インスペクターによるものです...したがって、そこではいくつかのトリックが行われている可能性があります。しかし、いったい何がこれを引き起こしているのでしょうか?

アップデート:

中古の実装を見つけましたoperator>>

PACKAGE TStream & operator >>(TStream &Stream, AnsiString &s)
{
    int i;

    Stream.ReadBuffer(&i, sizeof(i));
    if (i<0)
    {
        WideString ws;

        i=-i;
        ws.SetLength(i);
        if (i>0)
            Stream.ReadBuffer(ws.c_bstr(), i*sizeof(wchar_t));

        s=ws;

    } else if (i>0)
    {
        s.SetLength(i);
        Stream.ReadBuffer(s.c_str(), i);

    } else
        s="";

    return Stream;
}

ステップスルーすると、受信した文字列が正しく処理されるようです。WideStringしかし、問題が珍しくないということを聞いたことを思い出しているようです:P

更新2: 返される文字列の長さが6文字に末尾を加えたものであるインスタンスを実際に見つけました\0が、サイズは7に設定されています。したがって、間違ったサイズを提供するため、その文字列を送信するアプリケーションに解決策があると思います。

4

1 に答える 1

0

char正しく機能させるには余分なものを切り捨てる必要があるため、これらは明らかに同一ではありません。だから、その余分なものがchar実際に何であるかを調べてください。ストリームデータに最初からガベージが含まれているか、ストリームからAnsiStringを読み取っているコードに、ガベージを導入するロジックバグが含まれています。

デバッグインスペクタを使用するときは、AnsiStringの全長を考慮に入れていることを確認してください。デフォルトでは、インスペクターはAnsiStringをnullで終了する文字列として扱い、最初に見つかったnull文字に遭遇するとデータの表示を停止するため、AnsiStringに実際に存在するすべてのものを表示するには、インスペクターの「範囲」オプションを使用する必要があります。メモリー。

于 2013-01-16T05:48:31.510 に答える