c++基础速刷,查漏补缺(三)
速刷知识点,可用来查漏补缺
智能指针
shared_ptr
1.实现机制:在拷贝构造时使用同一份引用计数
- 模板指针:指向实际的对象
- 引用计数:使用new,存放在堆中
- 重载operator* 和operator->:实现指针的效果
- 重载copy constructor:引用计数+1
- 重载operator=:对右边的shared_ptr 调用析构函数,对左边的调用拷贝构造
- 重载析构函数:使应勇次数减一,当引用为0时,delete
2. 线程安全问题
同一个shared_ptr被多个线程“读”是安全的。
同一个shared_ptr被多个线程“写”是不安全的。
共享引用计数的不同的shared_ptr被多个线程“写”是安全的。
举例:现有三个shared_ptr,分别为s, a, b。其中s是多线程共享的,s指向对象A,a在线程1中,为空,b在线程2中,指向对象B。智能指针赋值有两步操作,1:指针赋值,2:引用计数加一。线程1先执行a=s,在完成指针复制后,a指向对象A,线程2抢占获得了运行资源,执行s=b,指针复制后,s指向对象B,b引用计数加一,对象A引用计数减一,归零,对象A被delete。此时,智能指针a指向了被销毁的对象,发生错误。
2. unique_ptr
unique_ptr唯一拥有其所指的对象:同一时刻,只能有一个unique_ptr指向给定对象,离开作用域时,若其指向对象,则delete该对象
unique_ptr需要绑定new操作符分配的堆中的对象
不支持拷贝和赋值,但可以通过release和reset移交指针的所有权
3. weak_ptr
为了配合shared_ptr而引入的指针,可能查看对象,但不增加引用计数,和shared_ptr指向相同的内存。
功能:作为访问内存的工具,且不影响对象的生命周期
遇到不会的知识点,欢迎在回复中提问,我会在回复中回答,或者另写文章具体讲解。
祝大家都能在秋招中斩获心仪的offer。
感谢阅读。