C++系列学习总结(四)

本文介绍了C++中的智能指针(auto_ptr,unique_ptr,share_ptr和weak_ptr),包括它们的作用、用法和常见操作,如get(),release(),reset()等,以及它们在内存管理和对象生命周期管理中的关键作用。
摘要由CSDN通过智能技术生成

this

this是一个指向当前对象实例的指针,也是一个const指针,保证指向的内容不能被更改,通过它可以访问当前对象的所有成员,包括public,private ,protected属性成员
this只能用在类的内部,
在C++中,为了调用一个非静态方法,可以通过this指向该方法。

class Entity
{
public:
	int x;
	int y;
	Entity(int x,int y) {
		this->x = x;
		this->y = y;
	}
};

这里的this是指将构造函数中的x,y赋值给成员变量x,y。

智能指针

智能指针本身是原始指针的包装,当创建一个智能指针时,它会调用new并分配内存,当使用结束后,最自动调用delete释放内存。

auto_ptr

头文件: #include < memory >
用 法: auto_ptr<类型> 变量名(new 类型)
例如auto_ptr<Entity> MyEntite(new Entity); auto_ptr<int> arr(new int[10];通过MyEntity调用Entity的成员函数,可以自动实现内存的申请与释放,MyEntity->print()(*MyEntity).print();

常用函数

get()

获取智能指针托管的指针地址,返回一个指针。

release()

取消智能指针对动态内存的托管,返回一个指针。

reset()

重置智能指针托管的内存地址,如果地址不同,原来的会被释放。

unique_ptr

唯一的智能指针,使用方式与auto_ptr几乎一致,但改善了一些功能,它持有对对象的独有权,即两个 unique_ptr 不能指向一个对象,不能进行复制操作只能进行移动操作。当它指向其他对象时,之前所指向的对象会被摧毁。其次,当 unique_ptr 超出作用域时,指向的对象也会被自动摧毁。
设计方法示例:unique_ptr<string> str(new string("snake"));或者unique_ptr<string> str=make_unique<string>;

操作结果
unique_ptr<…> up默认构造函数;使用默认/传递的删除器类型的实例作为删除器,创建一个空的唯一指针
unique_ptr up(nullptr)使用默认/传递的删除器类型的实例作为删除器,创建一个空的唯一指针
unique_ptr<…> up(ptr)unique_ptr<…> up(ptr)
unique_ptr<…> up(ptr,del)使用del作为删除器创建拥有* ptr的唯一指针
unique_ptr up(move(up2))创建一个拥有up2先前拥有的指针的唯一指针(此后up2为空)
unique_ptr up(move(ap))创建一个拥有先前由auto_ptr ap拥有的指针的唯一指针(此后ap为空)
up.~unique_ptr()析构函数;调用拥有者对象的删除器
up = move(up2)移动赋值(up2将所有权转移到up)
up = nullptr调用拥有者对象的删除器,并使其为空(等同于up.reset())
up1.swap(up2)交换up1和up2的指针和删除器
swap(up1,up2)交换up1和up2的指针和删除器
up.reset()调用拥有者对象的删除器,并使其为空(相当于up = nullptr)
up.reset(ptr)调用拥有者对象的删除器,并将共享指针重新初始化为自己的* ptr
up.release()将所有权放弃给调用者(不调用删除器就返回拥有的对象)
up.get()返回存储的指针(拥有的对象的地址;如果没有,则返回nullptr)
*up仅单个对象;返回拥有的对象(如果没有,则为未定义的行为)
up->…仅单个对象;提供拥有对象的成员访问权限(如果没有,则为未定义的行为)
up[idx]仅数组对象;返回具有存储数组的索引idx的元素(如果没有,则为未定义的行为)
up.get_deleter()返回删除器的引用

表格摘自:https://blog.csdn.net/xuyouqiang1987/article/details/104127669

share_ptr

shared_ptr 是存储动态创建对象的指针,其主要功能是管理动态创建对象的销毁,从而帮助彻底消除内存泄漏和悬空指针的问题。
基本原理:就是记录对象被引用的次数,当引用次数为 0 的时候,也就是最后一个指向该对象的共享指针析构的时候,共享指针的析构函数就把指向的内存区域释放掉。
与unique_ptr不同的是多个shared_ptr可以指向同一个地址。

操作结果
get()返回当前被share_ptr管理的指针
user_count()表示当前引用的计数
reset()表示重置当前存储的指针,原先所指向的对象会被销毁
swag()交换智能指针管理的对象

定义方法:

shared_ptr<int> ptr0=make_shared<int>();
shared_ptr<int> ptr1(ptr0);

不能将指针直接赋值给shared_ptr:shared_ptr<int> ptr=new int();.
避免使用两个独立的shared_prt来存储一个指针。

weak_ptr

weak_ptr通常不单独使用,只能和shared_ptr搭配使用,weak_ptr可以监视到它所指向的对象是否还存在。
创建时,用shared_ptr来初始化weak_prt指针,shared_ptr<int> ptr0=make_shared<int>(1); weak_ptr<int> ptr1(ptr0);

操作结果
use_count()获取与其共享的所指向对象的其他shared_ptr指针的数量
expired()判断所观测到资源是否已经被释放,即use.count()是否为0
reset()在弱引用中,将该弱引用指针设置为空,但不影响指向该对象的强引用数量
lock()判断weak_ptr所指向的shared_ptr对象是否存在,若存在则返回一个指向该对象的shared_ptr指针,若不存在,则返回一个空的shared_ptr

强引用

强引用:目标文件引用了外部符号,在链接时若未找到定义则报错;则对该外部符号的引用为强引用;
在这里插入图片描述

由于两个对象互相引用,它们的引用计数都是1,不能自动释放,并且此时这两个对象再无法访问到。

弱引用

弱引用:目标文件引用了外部符号,在链接时若未找到定义不报错;则对该外部符号的引用为弱引用;
在这里插入图片描述

weak_ptr只是提供了对管理对象的一个访问手段,不参与技术,即在循环中 ,只要把两个相互引用的某一方设置为弱引用,即可解除错误。

如有错误,请批评指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值