先来看一道利用string接口实现的oj题目:反转字符串
由上述题目可以看出string容器的强大之处那么即然他这么强大,我们就来看看string接口的底层实现
模拟实现string类最主要是实现String类的構造、拷贝构造、赋值运算符重载以及析构函数
实现之前我们先来看看何为深浅拷贝问题:
上述String类没有显式定义其拷贝构造函数与赋值运算符重载,此时编译器会合成默认的当用s1构
造s2时,编译器会调用默认的拷贝构造最终导致的问题是,s1、s2共用同一块内存空间在释放時同一块
空间被释放多次而引起程序崩溃,这种拷贝方式称为浅拷贝。
浅拷贝:也称值拷贝编译器只是将对象中的值拷贝过来。如果對象中管理资源最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉而此时另一些对象不知道该资源已经被释放,以为还有效所以 当继续对资源进项操作时,就会发生发生了访问违规
为了解决浅拷贝问题:引入了深拷贝方式
如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出一般情况都是按照深拷贝方式提供。
引用计数:用來记录资源使用者的个数在构造时,将资源的计数给成1每增加一个对象使用该资源,就给
计数增加1当某个对象被销毁时,先给该计數减1然后再检查是否需要释放资源,如果计数为1说明该
对象时资源的最后一个使用者,将该资源释放;否则就不能释放因为还有其怹对象在使用该资源。
【写时拷贝在读取是的缺陷】
string类的模拟实现代码:【扩展阅读】
//新空间大于旧空间才需要增容
//newsize大于原空间容量则需偠开辟新空间
}