没有合适的资源?快使用搜索试试~ 我知道了~
关于Cstring 类
资源推荐
资源详情
资源评论
关于 类
版权所有
看了很多人写的程序包括我自己写的一些代码,发现很大的一部分
是关于 类中的 的错误用法的出现这种错误的原因主要是对
的实现机制不是太了解。
是对于原来标准 中字符串类型的一种的包装。因为,通过很长
时间的编程,我们发现很多程序的 多和字符串有关典型的有:缓冲溢出、
内存泄漏等。而且这些 都是致命的,会造成系统的瘫痪。因此 里就
专门的做了一个类用来维护字符串指针。标准 里的字符串类是 ,在
! 类库中使用的是 类。通过字符串类,可以大大的避免
中的关于字符串指针的那些问题。
这里我们简单的看看 ! 中的 是如何实现的。当然,
要看原理,直接把它的代码拿过来分析是最好的。 里的关于 的类
的实现大部分在 "" 中。
就是对一个用来存放字符串的缓冲区和对施加于这个字符串的操
作封装。也就是说, 里需要有一个用来存放字符串的缓冲区,并且有
一个指针指向该缓冲区,该指针就是 #$%%&'"()。但是有些字符串
操作会增建或减少字符串的长度,因此为了减少频繁的申请内存或者释放内存,
会先申请一个大的内存块用来存放字符串。这样,以后当字符串长度
增长时,如果增加的总长度不超过预先申请的内存块的长度,就不用再申请内
存。当增加后的字符串长度超过预先申请的内存时, 先释放原先的内
存,然后再重新申请一个更大的内存块。同样的,当字符串长度减少时,也不
释放多出来的内存空间。而是等到积累到一定程度时,才一次性将多余的内存
释放。
还有,当使用一个 对象 来初始化另一个 对象 时,为
了节省空间,新对象 并不分配空间,它所要做的只是将自己的指针指向对象
的那块内存空间,只有当需要修改对象 或者 中的字符串时,才会为新对
象 申请内存空间,这叫做写入复制技术*"+,!-.。
这样,仅仅通过一个指针就不能完整的描述这块内存的具体情况,需要更
多的信息来描述。
首先,需要有一个变量来描述当前内存块的总的大小。
其次,需要一个变量来描述当前内存块已经使用的情况。也就是当前字符
串的长度
另外,还需要一个变量来描述该内存块被其他 引用的情况。有一
个对象引用该内存块,就将该数值加一。
中专门定义了一个结构体来描述这些信息/
)
0
1&!233!
)#(2331(!4*14.
511#(2331(!11
33%65&47511#(8
%65&94*.33%65&944
0*%65&9.*( .2:
:2
实际使用时,该结构体的所占用的内存块大小是不固定的,在 内
部的内存块头部,放置的是该结构体。从该内存块头部开始的
;!*).个 ,<%= 后才是真正的用于存放字符串的内存空间。这种
结构的数据结构的申请方法是这样实现的/
")>*)9. ?,<%=7;!*).
*# .9;!*%65&.82
")@511#(>#2
其中 # 是用于说明需要一次性申请的内存空间的大小的。
从代码中可以很容易的看出,如果想申请一个 A 个 %65& 的内存块用
于存放字符串,实际申请的大小是:
;!*).个 ,<%=+ *# .个 %65&
其中前面 ;!*).个 ,<%= 是用来存放 ) 信息的。
后面的 #+ 个 %65& 才是真正用来存放字符串的,多出来的一个用来存
放’BC。
中所有的 " 的都是针对这个缓冲区的。比如 #$%%&
//D,E*,!#(.,它的实现方法是/
首先通过 //D)*.取得 ) 对象的指针。该指针是
通过存放字符串的指针 '"() 先后偏移 ;!*).,从而得
到了 ) 的地址。
然后根据参数 ,!#( 给定的值重新实例化一个 ) 对象,
使得新的对象里的字符串缓冲长度能够满足 ,!#(。
然后在重新设置一下新的 ) 中的一些描述值。
最后将新 ) 对象里的字符串缓冲直接返回给调用者。
这些过程用 代码描述就是:
!*D)*.@&!@FF,!#(@D)*.
@511#(.
0
33?(?(E
)9"G14)>D)*.2
G14#>D)*.@)#(233511,E
?11"
!*,!#(HG14#.
,!#(>G14#2
511,E*,!#(.2
"+*'"()"G14)@4*.
*G14# .9;!*%65&..2
D)*.@)#(>G14#2
//&1*"G14).2
:
5=&%*D)*.@&!H>.2
33"((!(
5=&%*'"()I>JK##.2
'"()2
很多时候,我们经常的对大批量的字符串进行互相拷贝修改等,
使用了 "+,!- 技术。使用这种方法,当利用一个 对象
实例化另一个对象 的时候,其实两个对象的数值是完全相同的,但是如果简
单的给两个对象都申请内存的话,对于只有几个、几十个字节的字符串还没有
什么,如果是一个几 L 甚至几 的数据量来说,是一个很大的浪费。
因此 在这个时候只是简单的将新对象 的字符串地址
'"() 直接指向另一个对象 的字符串地址 '"()。所做的额外
工作是将对象 的内存应用 )//&! 加一。
//*M.
0
'"()>'"()2
N1O4N*MD)*.@&!.2
:
这样当修改对象 或对象 的字符串内容时,首先检查 )//
&! 的值,如果大于一*等于一,说明只有自己一个应用该内存空间.,说明
该对象引用了别的对象内存或者自己的内存被别人应用,该对象首先将该应用
值减一,然后将该内存交给其他的对象管理,自己重新申请一块内存,并将原
来内存的内容拷贝过来。
其实现的简单代码是:
4//"+,!-*.
剩余11页未读,继续阅读
资源评论
lovecpp_jiangaifen
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 中文-生僻字-龙年流行
- matlab实现rfid(2ASK信号的调制与解调)可以直接出仿真结果
- 漫画牛app.apk
- QPSK的锁相环程序,在MATLAB环境下编写的
- 一分钟成为点灯大师(超简单8行代码-STM32F407的HAL库定时器方式实现LED每隔1秒闪烁)
- c89c9ae435b3beb574fc729c96a803f0_bigAttachIdentifer.mp4
- 多式联运基于遗传算法求解多式联运低碳路径规划问题matlab源码
- DWC PCIe databook(EP) Version 5.40a
- USB无线网卡驱动 USB\VID-1A86&PID-E397&REV-0738
- matlab实现2ASK通信系统仿真进行2ASK调制
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功