<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
vc++ 6.0标准库string类的bug
许式伟
2006-12-23
basic_string类的用途
basic_string并不象它的名字那样,只可能是一个字符串。有时候,它不那么象字符串。例如:
typedefstd::basic_stringdouble>DoubleArray;
此时,basic_string是一个double类型的动态数组。你可能说,为什么不用vector呢?如下:
typedefstd::vectordouble>DoubleArray;
这两者有什么不同?其实最大的不同,在于basic_string类通常是基于copy-on-write技术的。这意味着basic_string的赋值操作(operator=)只是一个简单的加引用计数(AddRef),是相当快速的。而vector类的赋值操作则是真正的内存拷贝过程。
现在我要实现一个矩阵(Matrix)类。你可以想象一下现在要矩阵的各种运算,例如加法(operator+):
Matrixoperator+(constMatrix&a,constMatrix&b)
{
Matrixresult=a;
result+=b;
returnresult;
}
你可以发现,如果Matrix内部采用vector,而不是用basic_string,那么Matrix类的operator+中就有多次无谓的内存拷贝过程。
bug的发现
我的Matrix类一直工作的很好,直到有一天,我发现某个Matrix的数据少了。跟踪发现,问题出在basic_string的copy-on-write实现上。vc++ 6.0的stl中,basic_string通过_Split函数进行分裂:
classbasic_string{
void_Split()
{if(_Ptr!=0&&_Refcnt(_Ptr)!=0&&_Refcnt(_Ptr)!=_FROZEN)
{_E*_Temp=_Ptr;
_Tidy(true);
assign(_Temp);}}
};
问题出在上面的assign语句上。你的数组被理解为是一个'/0'结尾的“字符串”。这样_Split操作完成后,如果某个数组元素为0,数据变少了。
bug的修复
找到了肇事者,修改代码还是很容易,如下:
void_Split()
{if(_Ptr!=0&&_Refcnt(_Ptr)!=0&&_Refcnt(_Ptr)!=_FROZEN)
{_E*_Temp=_Ptr;
size_type_N=_Len;
_Tidy(true);
assign(_Temp,_N);}}//@@codemodify:assign(_Temp);--->bugfixedbyxushiwei
问题在于:
- 既然它是标准库,直接修改它的代码并不是很好,因为你的同事(或者其他人)还在用着有问题的版本。
- 如果你采用MultiThread DLL模式链接C++标准库,这意味着就算你修改了vc++的头文件也没用,因为编译器最终链接的是dll中的代码,而不是你修改后的代码。
怎么办呢?
winx就这个问题进行了一定程度的修复(参见最新的发布包)。也就是说,只要你包含了最新的winx,多数情况下不会出现此bug。但如果你采用MultiThread DLL模式链接C++标准库(问题挺严重,因为这是推荐的链接方式),那么你需要小心使用string、wstring类(但是其他类诸如basic_string<double>没问题),因为此模式下winx并没有修复该bug。注意不要让字符串中出现'/0'字符即可。如果确实需要出现'/0'的字符串,可使用winx::CString类。</double>
点击以下链接下载最新的WINX:
分享到:
相关推荐
VC++6.0模板库手册 VC++6.0模板库手册
VC++ 6.0 运行库参考手册
vc++6.0 运行库参考手册,运行库的各种参考资料
编者 求是科技 王正军 《VC++6.0从入门到精通》源码,
vc++6.0下开发的仓库管理系统,采用ADO操作数据库,使用数据库为ACCE-vc 6.0's warehouse management system using ADO operational database, using the database to ACCE
使用VC++6.0,编写的MFC程序,实现正弦曲线的绘制,包括横纵坐标轴的绘制。
可以在win7上使用的VC++6.0,包含英文版
免费vc++6.0安装包程序(majin)免费vc++6.0安装包程序(majin)免费vc++6.0安装包程序(majin)免费vc++6.0安装包程序(majin)免费vc++6.0安装包程序(majin)免费vc++6.0安装包程序(majin)免费vc++6.0安装包...
VC++ 6.0 音乐播放器VC++ 6.0 音乐播放器VC++ 6.0 音乐播放器VC++ 6.0 音乐播放器VC++ 6.0 音乐播放器
VC++6.0 基于MFC的windows资源管理器风格单文档应用程序 学生管理系统实现增删改查学生信息
在学习过程中用VC++制作的一款游戏,可以和手机游戏媲美,有很高的参考价值
VC++6.0 Edit 使用示例(含多项功能),例如:改变文本的字体,文本的颜色,文本的背景,对话框的背景,文本的追加,文本的逐行读取与保存,滚动条的滚动操作等等。
VC++6.0快捷键大全 为VC++6.0快捷键大全.txt 方便参阅
Win32环境下基于VC++6.0串口通信编程方法
VC++6.0中文简体版下载,支持win7。此前装过别的版本,但win7大多装不上,有的能装上但过程太繁琐,此外别的版本有几百兆,下载费时费力,而这只有30几兆,而且可直接安装运行,对于专业人士来说此版本功能可能过于...
VC++6.0 开发宝典 VC++6.0 开发宝典 VC++6.0 开发宝典
VC++6.0使用方法(精品简约).doc VC++6.0使用方法(精品简约).doc VC++6.0使用方法(精品简约).doc VC++6.0使用方法(精品简约).doc VC++6.0使用方法(精品简约).doc VC++6.0使用方法(精品简约).doc VC++6.0使用方法(精品...
用VC++6.0打开工程文件dsw即可查看和编译代码。。。。。。
VC++6.0简体中文版本,支持win7提示兼容问题忽略就行。 此前装过别的版本,但win7大多装不上,有的能装上但过程太繁琐。 别的版本有几百兆,而这只有30来兆,而且可直接安装运行,对于专业人士来说此版本功能过于简单...
c++课程设计vc++6.0c++课程设计vc++6.0c++课程设计vc++6.0c++课程设计vc++6.0c++课程设计vc++6.0c++课程设计vc++6.0