私は地図を持っています
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に設定されています。したがって、間違ったサイズを提供するため、その文字列を送信するアプリケーションに解決策があると思います。