0

我有一张地图

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。所以我想我的解决方案将在应用程序中发送该字符串,因为它提供了错误的大小。

4

1 回答 1

0

它们显然不相同,因为您需要截断额外的char内容以使其正常工作。所以找出额外的char实际是什么。流数据一开始就有垃圾,或者从流中读取 AnsiString 的代码中存在引入垃圾的逻辑错误。

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

于 2013-01-16T05:48:31.510 回答