原文地址: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时存在问题,测试代码如下:
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技术,对于如下代码:
在执行语句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)