String 类 Copy-On-Write 技术以及使用时存在的风险
先来看一下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 技术以及使用时存在的风险的更多相关文章
- STL 的string类怎么啦?
前言 上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对strin ...
- Java技术——你真的了解String类的intern()方法吗
0.引言 什么都先不说,先看下面这个引入的例子: String str1 = new String("SEU")+ new String("Calvin") ...
- Java技术——String类为什么是不可变的
0. 前言 如果一个对象,在它创建完成之后不能再改变它的状态,包括对象内的成员变量.基本数据类型的值等等.那么这个对象就是不可变的.众所周知String类就是不可变的.转载请注明出处为SEU_Ca ...
- C++的std::string的“读时也拷贝”技术!
C++的std::string的读时也拷贝技术! 嘿嘿,你没有看错,我也没有写错,是读时也拷贝技术.什么?我的错,你之前听说写过时才拷贝,嗯,不错的确有这门技术,英文是Copy On Write,简写 ...
- 标准C++中的string类的用法总结
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- C#中是否可以继承String类
C#中是否可以继承String类? 答:String类是sealed类故不可以继承. 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 HoverTree ...
- 关于如何来构造一个String类
今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实现..... 内容写的过于简单,没有涉及到其 ...
- VC++ 标准C++中的string类的用法总结
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...
- 标准C++中string类的用法
转自博客园:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非 ...
随机推荐
- Android4.2增加新键值
这里添加新的键值,不是毫无凭据凭空创造的一个键值, 而是根据kernel中检测到的按键值,然后转化为android所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Bro ...
- 使用putty登陆cygwin出现server unexpectedly ...error.解决方案
将cygwin安装目录下/etc/passwd中的passwd文件中user:unused:32707:10513:U-CYOU-INC\user,S-1-5-21-2645613570-259884 ...
- linux下的工具总结
1. 编译阶段 gcc: -Wall -Werror -O2 make nm: nm -C a.o c++filt strip objdump readelf 2. 链接 ldd: ldd ./a.o ...
- DZY Loves Colors
CF #446C:http://codeforces.com/problemset/problem/444/C 题意:给你n个数,大小从1到n,然后又两种操作,1 a b c表示把区间a b 更新为c ...
- poj 2031Building a Space Station
http://poj.org/problem?id=2031 #include<cstdio> #include<cstring> #include<cmath> ...
- UOJ 217 奇怪的线段树
http://uoj.ac/problem/217 题意就不X了,思路在这: 居然一开始把sap里面的mn设置为inf了,我是傻逼.. #include<cstdio> #include& ...
- HDOJ 1018 Big Number(大数位数公式)
Problem Description In many applications very large integers numbers are required. Some of these app ...
- Android SDK的下载和安装
Android SDK包含的各种库文件.文档.源代码.示例代码……都是通过SDK Tools来下载和安装的,所以我们需要首先下载和安装SDK工具包(SDK Tools Package). 这一步我们可 ...
- javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法
在很多人眼里,北京是一个物欲横流的社会,生活节奏之快,让你一丝都不能停下来,走在路上伴随着人群急速往前涌,或许有些人都不知道要去哪.也不知道自己想要的是什么?在一个浮躁的社会里,多了一些浮躁的人,到处 ...
- RMQ——窗口题解
题目:窗口 描述: [问题描述] 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: Window position Min val ...