在地图中使用AnsiString作为键时的奇怪问题

时间:2013-01-15 10:49:23

标签: map c++builder c++builder-2010 ansistring

我有一张地图

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>

1 个答案:

答案 0 :(得分:0)

它们显然不完全相同,因为您需要截断一个额外的char以使其正常工作。那么找出实际上是多余的char。要么流数据开头都有垃圾,要么从流中读取AnsiString的代码中有一个逻辑错误,它会引入垃圾。

使用调试检查器时,请确保考虑AnsiString的整个长度。默认情况下,检查器将AnsiString视为空终止字符串,因此在遇到找到的第一个空字符时停止显示数据,因此您可能需要使用检查器的“范围”选项来查看AnsiString中实际存在的所有内容。存储器中。