原文地址:http://www.dinkumware.com/vc_fixes.html
Fix to algorithm
內建函式_Buffered_merge中的兩個局部變數未作初始化,VC6已作糾正。
Fix to deque
改動相當大,差不多是重寫了整個代碼。我未作分析。
Fix to fstream
該BUG主要影響效率,從代碼可以看出,只有當_Closef不等於_Openf1時才可能執行後面的_Mysb::_Init,這樣對於通過open方式開啟一指定檔案(函數為_Myt *open(const char *_S, ios_base::openmode _M))則有不好的效能。
Fix to istream
getline函數在處理終止符時存在問題,VC6已作糾正。
Fix to list
sort方法在元素數量大於等於32768時存在問題,測試代碼如下:
void test_list()
{
cout << "list::sort test..." << endl;
list<int> li1, li2; // 兩個list用於比較
const int count = 32768; // 元素數量,>=32768將出現BUG
vector<int> vi; // vector用於產生隨機序列
vi.resize(count);
for(int i=1; i<=count; ++i)
{
vi[i-1] = i;
li1.push_back(i);
}
srand( time(0) );
random_shuffle(vi.rbegin(), vi.rend());
//copy(vi.begin(), vi.end(), ostream_iterator<int>(cout, " "));
li2.resize(count);
copy(vi.begin(), vi.end(), li2.begin());
li2.sort(); // 排序
//copy(li2.begin(), li2.end(), ostream_iterator<int>(cout, " "));
bool res = (li1 == li2); // 比較二者
cout << " elements_count=" << count << ", result=" << res << endl;
}
Fix to memory
auto_ptr在賦值時存在問題,VC6已作糾正。
Fix to sstream
basic_stringbuf::overflow在處理記憶體增長時太緩慢,嚴重影響效能。
Fix to string
問題與istream類似,均為getline處理終止符時有問題。我未對該問題做分析,不知道它在什麼情況下出現以及有什麼後果。
Fix to vector
該問題不明顯,我不清楚它在什麼情況下會出現。按照其代碼,只有當_First或_Last受到意外改寫才可能造成問題。
Fix to xmemory
該問題不易出現,屬於編譯器的BUG。
Fix to xstring
P.J. STL中的的string採用了copy on write和reference counting技術,對於如下代碼:
string s1 = "abc"; // 語句1
string s2 = s1; // 語句2
s2 = "123"; // 語句3
在執行語句2時,不會出現兩份"abc",而是讓s2與s1共用一份記憶體。
當執行語句3時,s2的值被改寫,這時才會單獨為其分配記憶體。
實現這一方式的手段是引用計數,為此,P.J. STL採用了一個巧妙的手段,即在分配記憶體時多申請了一個位元組的空間(位於起始處),這一位元組被用作引用計數,由此可知,其計數的最大值只能是255,該值用宏_FROZEN表示。
但是P.J. STL並沒有考慮引用計數在多線程環境下的同步問題,因此存在潛在的錯誤。解決這一問題最簡單的辦法是將_FROZEN的值改為0,即去掉引用計數功能。而完備的方案則需自己動手實現多線程同步。
Fix to xtree
改動較大,對map、multimap、set和multiset存在影響,未作分析。
(freefalcon於2006-04-11)