内存管理,string模拟实现(中)

这里在string.h里面使用cout会报错因为,在Text里面编译器只会往上找虽然找到了iostream但是,iostream被std围起来了,还没有展开 ,编译器只会向上看,下面虽然展开了,但是看不到

这里capacity可能是0或者随机值

Begin名字变了就不支持了范围for底层就是迭代器,*it赋值给ch

ch++不会改变str本身的内容 ,除非ch前面加引用&

const修饰的静态整形成员变量可以初始化(特例)

不加const的就不可以,只能在外面初始化

insert实现pos位置插入为了避免end进行整形提升(-1>=0)把end往后移一位或者end强转int

scanf和cin空格和换行都拿不到 ,getchar能拿到

cin是isoream的对象提供的有get

在这里编译器并不会优化,而是需要s去拷贝构造一个对象再给赋值给sub1 

用一个已经存在的对象 去初始化另一个对象是 拷贝构造,这是经典的浅拷贝(会析构两次)

在这里 最好要初始化,因为this(s2)是内(类)置类型,我们没有写编译器不保证会初始化,所以跟tmp交换后,当析构tmp时(此时tmp里面的str,size,capacity是随机值)会出错

他俩的capacity都是15  ,但是sizeof也一样,为什么呢?明明字符串一样,因为如果字符串小于16(有个\0)会存到buff里面,超过16就不用存到buff了

为了避免浅拷贝析构两次,设置引用计数,s出了作用域不析构而是计数- - ,=1说明还有人指向这块空间,这就意味着拷贝的时候增加引用计数,引用计数到0时候,说明是最后一个对象,再释放空间。

如果修改数据  例如tmp【0】=‘x’ 这时还带深拷贝  引用计数,为2时说明还有人指向这块空间,就只能深拷贝,然后计数--;

 

vs是深拷贝,llinux是浅拷贝 

 linux修改后 s1修改了s2不动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值