使用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。所以我想我的解決方案將在應用程序發送該字符串,因爲它提供了錯誤的大小。
顯然;)...讀取'AnsiString'的代碼基本上是'TMemoryStream * data; AnsiString foo; * data >> foo',與工作地點相同。 – inquam
是的,這個問題是故意添加到一個特定的字符串從發送應用程序,導致「長度」不正確。 – inquam
'* data >> foo'這怎麼編譯? 'TMemoryStream'和'AnsiString'都沒有定義從流中讀取字符串的'>>'操作符。你有沒有實現自己的自定義操作符? –