vc++ 6.0标准库string类的bug

寂寞難耏

寂寞難耏

2016-02-19 18:41

下面这个vc++ 6.0标准库string类的bug教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

basic_string类的用途
basic_string并不象它的名字那样,只可能是一个字符串。有时候,它不那么象字符串。例如:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

typedef std::basic_stringdouble DoubleArray;
此时,basic_string是一个double类型的动态数组。你可能说,为什么不用vector呢?如下:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

typedef std::vectordouble DoubleArray;
这两者有什么不同?其实最大的不同,在于basic_string类通常是基于copy-on-write技术的。这意味着basic_string的赋值操作(operator=)只是一个简单的加引用计数(AddRef),是相当快速的。而vector类的赋值操作则是真正的内存拷贝过程。

现在我要实现一个矩阵(Matrix)类。你可以想象一下现在要矩阵的各种运算,例如加法(operator+):

Matrix operator+(const Matrix& a, const Matrix& b)
{
    Matrix result = a;
    result += b;
    return result;
}
你可以发现,如果Matrix内部采用vector,而不是用basic_string,那么Matrix类的operator+中就有多次无谓的内存拷贝过程。

bug的发现
我的Matrix类一直工作的很好,直到有一天,我发现某个Matrix的数据少了。跟踪发现,问题出在basic_string的copy-on-write实现上。vc++ 6.0的stl中,basic_string通过_Split函数进行分裂:

class basic_string {
    void _Split()
        {if (_Ptr != 0 && _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN)
            {_E *_Temp = _Ptr;
            _Tidy(true);
            assign(_Temp); }}
};
问题出在上面的assign语句上。你的数组被理解为是一个'

展开更多 50%)
分享

猜你喜欢

vc++ 6.0标准库string类的bug

编程语言 网络编程
vc++ 6.0标准库string类的bug

在VC++中建立自定义数据库类

编程语言 网络编程
在VC++中建立自定义数据库类

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

VC++ 6.0制作QQ连连看外挂

编程语言 网络编程
VC++ 6.0制作QQ连连看外挂

VC++ 6.0使用复选框和单选钮

C语言教程 C语言函数
VC++ 6.0使用复选框和单选钮

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Vc++中Ado动态创建access数据库

编程语言 网络编程
Vc++中Ado动态创建access数据库

VC++ MFC DLL动态链接库编写详解

编程语言 网络编程
VC++ MFC DLL动态链接库编写详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在Word2010中打开最近使用的文档

在Word2010中打开最近使用的文档

在WPS文字2018中制作多行合一的文字

在WPS文字2018中制作多行合一的文字
下拉加载更多内容 ↓