2013-01-15 36 views
0

使用AnsiString類型爲重點時,我有一個地圖奇怪的問題在地圖

map<AnsiString, Foo*>

當我嘗試查找值我用我從一個TMemoryStream收到一個字符串,並將其發送到地圖Foo* GetFoo(AnsiString)函數依次創建一個迭代器並返回找到的對象。這在大多數情況下工作正常,但在ONE函數中它不返回值。

如果我這樣做FooID = FooID.SetLength(FooID.Length() - 1);其中FooID是AnsiString用於查找它的工作並返回正確的結果。我在想,流中可能會有一些垃圾,但是當我查看在開箱即用的地方使用的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。所以我想我的解決方案將在應用程序發送該字符串,因爲它提供了錯誤的大小。

回答

0

它們顯然不相同,因爲您需要截斷一個額外的char以使其正常工作。所以找出那個額外的char實際上是。流數據中有開始的垃圾,或者從流中讀取AnsiString的代碼有一個邏輯錯誤,它引入垃圾。

當您使用調試檢查器時,請確保您考慮到AnsiString的整個長度。默認情況下,檢查器將一個AnsiString視爲一個以null結尾的字符串,因此在遇到它找到的第一個空字符時停止顯示數據,因此您可能需要使用檢查器的「Range」選項來查看AnsiString中實際存在的所有內容記憶。

+0

顯然;)...讀取'AnsiString'的代碼基本上是'TMemoryStream * data; AnsiString foo; * data >> foo',與工作地點相同。 – inquam

+0

是的,這個問題是故意添加到一個特定的字符串從發送應用程序,導致「長度」不正確。 – inquam

+0

'* data >> foo'這怎麼編譯? 'TMemoryStream'和'AnsiString'都沒有定義從流中讀取字符串的'>>'操作符。你有沒有實現自己的自定義操作符? –