Map 使用AnsiString作为映射中的键时出现奇怪的问题

Map 使用AnsiString作为映射中的键时出现奇怪的问题,map,c++builder,c++builder-2010,ansistring,Map,C++builder,C++builder 2010,Ansistring,我有一张地图 map 当我试图在映射中查找值时,我使用从TMemoryStream收到的字符串,并将其发送到Foo*GetFoo(AnsiString)函数,该函数反过来创建迭代器并返回找到的对象。这在大多数情况下都可以正常工作,但在一个函数中它不返回值 如果我执行FooID=FooID.SetLength(FooID.Length()-1)其中FooID是用于查找的AnsiString,它工作并返回正确的结果。我原以为流中可能有一些垃圾,但当我看到在开箱即用的地方和需要破解的地方使用的答案时,

我有一张地图

map

当我试图在映射中查找值时,我使用从
TMemoryStream
收到的字符串,并将其发送到
Foo*GetFoo(AnsiString)
函数,该函数反过来创建迭代器并返回找到的对象。这在大多数情况下都可以正常工作,但在一个函数中它不返回值

如果我执行
FooID=FooID.SetLength(FooID.Length()-1)
其中
FooID
是用于查找的AnsiString,它工作并返回正确的结果。我原以为流中可能有一些垃圾,但当我看到在开箱即用的地方和需要破解的地方使用的答案时,它们是一样的

这是根据IDE的调试值检查器。。。所以那里可能有一些诡计。但究竟是什么导致了这一切呢

更新:

我发现使用了
操作符>
的实现

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;
}
PACKAGE-TStream&operator>>(TStream&Stream、AnsiString&s)
{
int i;
Stream.ReadBuffer(&i,sizeof(i));
if(i0)
ReadBuffer(ws.c_bstr(),i*sizeof(wchar_t));
s=ws;
}如果(i>0),则为else
{
s、 设定长度(i);
Stream.ReadBuffer(s.c_str(),i);
}否则
s=“”;
回流;
}
单步执行似乎可以正确处理接收到的字符串。但我似乎记得听说
WideString
的问题并不少见:P

更新2:
我实际上发现了一个实例,其中返回的字符串长度为6个字符,加上结尾
\0
,但大小设置为7。因此,我想我的解决方案是在发送该字符串的应用程序中,因为它提供了错误的大小。

它们显然不相同,因为需要截断额外的
字符才能使其正常工作。因此,找出额外的
char
实际上是什么。要么流数据中有垃圾,要么从流中读取ansisting的代码中有一个引入垃圾的逻辑错误


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

显然;)。。。读取
AnsiString
的代码基本上是
TMemoryStream*数据;安斯廷福*数据>>foo
,与在工作的地方一样。是的,问题是有意将内容添加到发送应用程序的一个特定字符串中,导致
长度不正确。
*数据>>foo
这是如何编译的?无论是
TMemoryStream
还是
ansisting
都不能定义从流中读取字符串的
>
运算符。您是否实现了自己的自定义运算符?正如您在上面看到的,我确实找到了该运算符的自定义实现。