先来看一下string 面试时的简易写法(使用的是深拷贝):

class String
{
String()
:str(new char[])
{
str[] = '\0';
} String(char* p, size_t size)
:str(new char[size + ])
{
strcpy(str, p);
} String(String& Str)
:str(new char[strlen(Str.str)+])
{
strcpy(str, Str.str);
} String& operator=(String& Str)
{
if (this != &Str)
{
String StrTmp = Str;
swap(str, StrTmp.str);
}
return *this;
} ~String()
{
delete[] str;
} //深拷贝与浅拷贝

  当对string的对象不进行修改,也就是只读的时候,我们创建新对象时可以用新的string类中的char*来指向原先旧的string中字符串的起始位置,如果用深拷贝就存在内存浪费的问题,因为我们每构造出一个对象时都是重新开辟新的空间来存储字符串。所以呢 Copy_On_Write的思想被提出来了,Copy_On_Write 就是指在修改string时才开辟空间来保存修改后的string,而如果不修改呢,我们就用浅拷贝,直接用string中char*进行赋值,引用计数加一,析构时如果引用计数减为0,则释放保存字符串的空间。

写实拷贝的模型一:

class String
{
String()
:_str(new char[]), _count(new int())
{
_str[] = '\0';
} String(char* p, size_t size)
:_str(new char[size + ]), _count(new int())
{
strcpy(_str, p);
} String(String& Str)
:_str(Str._str), _count(Str._count)
{
strcpy(_str, Str._str);
*_count++;
} String& operator=(String& Str)
{
if (this != &Str)
{
if (--*_count == )
delete[] _str;
_str = Str._str;
_count = Str._count;
*_count++;
}
return *this;
} ~String()
{
delete[] _str;
} protected:
char* _str;
int* _count; //引用计数
};

写实拷贝的模型二:

class String
{
public:
String()
:_str(new char[])
{
_str = _str + ;
_str[] = '\0';
int count = _Count(_str);
count = ;
} String(char* p)
:_str(new char[strlen(p) + ])
{
_str = _str + ;
strcpy(_str, p);
int& count = _Count(_str);
count = ;
} String(String& Str)
:_str(Str._str)
{
++_Count(_str);
} String& operator=(String& Str)
{
if (this != &Str)
{
if (_Count(_str))
delete[](_str - );
_str = Str._str;
++_Count(_str);
}
return *this;
} ~String()
{
if (--_Count(_str) == )
delete[] _str;
} int& _Count(char* p)
{
return *(int*)(p - );
}
protected:
char* _str;
};

写实拷贝引发的问题:参见博文

C++ 之 stl::string 写时拷贝导致的问题

String 类 Copy-On-Write 技术以及使用时存在的风险的更多相关文章

  1. STL 的string类怎么啦?

    前言   上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对strin ...

  2. Java技术——你真的了解String类的intern()方法吗

    0.引言 什么都先不说,先看下面这个引入的例子:   String str1 = new String("SEU")+ new String("Calvin") ...

  3. Java技术——String类为什么是不可变的

    0. 前言   如果一个对象,在它创建完成之后不能再改变它的状态,包括对象内的成员变量.基本数据类型的值等等.那么这个对象就是不可变的.众所周知String类就是不可变的.转载请注明出处为SEU_Ca ...

  4. C++的std::string的“读时也拷贝”技术!

    C++的std::string的读时也拷贝技术! 嘿嘿,你没有看错,我也没有写错,是读时也拷贝技术.什么?我的错,你之前听说写过时才拷贝,嗯,不错的确有这门技术,英文是Copy On Write,简写 ...

  5. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  6. C#中是否可以继承String类

    C#中是否可以继承String类? 答:String类是sealed类故不可以继承. 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 HoverTree ...

  7. 关于如何来构造一个String类

    今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实现..... 内容写的过于简单,没有涉及到其 ...

  8. VC++ 标准C++中的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  9. 标准C++中string类的用法

    转自博客园:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非 ...

随机推荐

  1. An unspecified error occurred!

    在我们生成证书的时候,有时候会遇到这个问题,明明刚从电脑的钥匙串申请的证书,却报错!遇到这个不用急.多试几次.不是你的生成的证书不管用,多半原因是因为你的网速太挫了!

  2. UGUI穿透3D世界判断&&UGUI全事件监听

    public bool isPointUI(){ PointerEventData eventDataCurrnt = new PointerEventData (EventSystem.curren ...

  3. BZOJ 2434 阿狸的打字机

    http://www.lydsy.com/JudgeOnline/problem.php?id=2434 思路:建立fail树,并找出dfs序,那剩下要做的就是每次找到一个串的位置,然后询问它的区间里 ...

  4. new Random().nextInt

    public static void main(String[] args) { System.out.println(new Random().nextInt(0)); } Exception in ...

  5. linux wenjian

    文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件.利用这种机制能够使读写单个文件的过程变得更安全. 在这篇文章中,我们将探讨Linux中不同类型的文件锁,并通过示例程序来理解它们之 ...

  6. topcoder13185 TreePuzzle

    https://community.topcoder.com/stat?c=problem_statement&pm=13185 被wck屠了. 考试时候想分类讨论,结果发现情况有点复杂,最后 ...

  7. 【宽搜】Vijos P1051 送给圣诞夜的极光

    题目链接: https://vijos.org/p/1051 题目大意: 给一张‘-’和‘#’的图,规定曼哈顿距离小于等于2的‘#’属于同一图案,求图案数.[曼哈顿距离:对于A(x1,y1)和B(x2 ...

  8. Introduction to Web Services

    What are Web Services? Web Services are client and server applications that communicate over the Wor ...

  9. JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法

    昨天拿到JNI的Android工程Demo,然后把demo整合到开发的主线工程上,发现调用JNI方法一直抛同一个异常 java.lang.UnsatisfiedLinkError: XXXclass. ...

  10. Android使用GridView实现日历功能(详细代码)

    代码有点多,发个图先: 如果懒得往下看的,可以直接下载源码吧(0分的),最近一直有人要,由于时间太久了,懒得找出来整理,今天又看到有人要,正好没事就整理了一下 http://download.csdn ...