vc++ 6.0标准库string类的bug

2016-02-19 18:41 18 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

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

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

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

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

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

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语句上。你的数组被理解为是一个'

来源:http://www.tulaoshi.com/n/20160219/1618641.html

延伸阅读
准备: (1)、引入ADO类 #import "c:program filescommon filessystemadomsado15.dll" no_namespace rename ("EOF", "adoEOF") (2)、初始化COM 在MFC中可以用AfxOleInit();非MFC环境中用: CoInitialize(NULL); CoUnInitialize(); (3)#import 包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr 1.连接和关闭数据...
在VC++中有两种方法可以进行串口通讯。一种是利用Microsoft公司提供的ActiveX控件 Microsoft Communications Control。另一种是直接用VC++访问串口。下面将简述这两种方法。 一、Microsoft Communications Control Microsoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进行通讯。在使用它之前,应将...
在VC编程中,操作文件的方法主要有两种:利用API函数和MFC的CFile类。微软在其中封装了文件的一般操作,下面我就介绍一下如何利用这两种方法实现文件操作。 1.创建或打开一个文件 API函数CreateFile可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,但是在此时只是介绍用这个函数怎么实现创建和打开一个文件。 HANDL...
预备: (1)、引入ADO类 #import "c:program filescommon filessystemadomsado15.dll" no_namespace rename ("EOF", "adoEOF") (2)、初始化COM在MFC中可以用AfxOleInit();非MFC环境中用: CoInitialize(NULL); CoUnInitialize();(3)#import 包含后就可以用3个智能指针了:_ConnectionPtr、_Recor...
一、引用 当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图。应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一。 切分窗口分为动态切分窗口和静态切分窗口,它们都是由CsplitterWnd类(MFC类库)来实现的,在这两种表示方式中,...

经验教程

276

收藏

14
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部