我有一张地图
map<AnsiString, Foo*>
当我尝试在地图中查找值时,我使用从TMemoryStream
收到的字符串并将其发送到Foo* GetFoo(AnsiString)
函数,该函数又创建迭代器并返回找到的对象。这在大多数情况下都可以正常工作,但在一个函数中它不会返回值。
如果我FooID = FooID.SetLength(FooID.Length() - 1);
FooID
其中operator>>
是用于查找的AnsiString,它可以正常工作并返回正确的结果。我在想流中可能有一些垃圾,但是当我看到开箱即用的地方使用的AnsiStrings以及需要黑客攻击的地方时,它们是相同的!?
这是根据IDE的调试值检查器...所以可能会有som trickery在那里。但究竟是什么导致了这一点?
更新
我找到了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
单步执行它似乎正确处理收到的字符串。但我似乎记得听到\0
的问题并不罕见:P
更新2: 我实际上找到了一个实例,其中返回的字符串是6个字符长加上结尾{{1}}但是大小设置为7.所以我想我的解决方案将在应用程序发送该字符串,因为它提供了错误的大小。< / p>
答案 0 :(得分:0)
它们显然不完全相同,因为您需要截断一个额外的char
以使其正常工作。那么找出实际上是多余的char
。要么流数据开头都有垃圾,要么从流中读取AnsiString的代码中有一个逻辑错误,它会引入垃圾。
使用调试检查器时,请确保考虑AnsiString的整个长度。默认情况下,检查器将AnsiString视为空终止字符串,因此在遇到找到的第一个空字符时停止显示数据,因此您可能需要使用检查器的“范围”选项来查看AnsiString中实际存在的所有内容。存储器中。