我有一张地图
map<AnsiString, Foo*>
当我尝试在地图中查找值时,我使用从 a 接收到的字符串TMemoryStream
并将其发送到一个Foo* GetFoo(AnsiString)
函数,该函数又创建一个迭代器并返回找到的对象。这在大多数情况下都可以正常工作,但在 ONE 函数中它不返回值。
如果我这样做FooID = FooID.SetLength(FooID.Length() - 1);
AnsiStringFooID
用于查找它的工作原理并返回正确的结果。我在想流中可能有一些垃圾,但是当我查看在开箱即用的地方和需要破解的地方使用的 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。所以我想我的解决方案将在应用程序中发送该字符串,因为它提供了错误的大小。