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只是提供了对管理对象的一个访问手段,不参与技术,即在循环中 ,只要把两个相互引用的某一方设置为弱引用,即可解除错误。
如有错误,请批评指正!