大家好,这里是国中之林!
❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←
shared_ptr目录
- 一.共享性智能指针
- 二.shared_ptr的共享原理
- 三.shared_ptr的构造函数
- 四.shared_ptr的初始化
- 五.shared_ptr的主动释放
- 六.shared_ptr的重置
- 七.shared_ptr的交换
- 八.shared_ptr的使用陷阱
一.共享性智能指针
unique_ptr是排他性的,对于同一块地址的指针,只能一个智能指针进行管理.
那么共享性的就是,对于同一块地址的指针,可以有多个智能指针进行管理.
二.shared_ptr的共享原理
智能指针中会存在一个用来计数的函数,就是指向同一块地址指针的智能指针数量.
运行结果:
p1本来没有指向指针,计数为0.
p2指向指针new Person(2),计数为1.
当p1=p2时,p1也就指向p2指向的指针了,计数为2.
拷贝同样如此.
当某一个智能指针生命周期结束时,计数就会减1,当减为0时,就会调用析构,释放内存.
三.shared_ptr的构造函数
1.普通的
2.数组的
3.带删除器的
四.shared_ptr的初始化
1.通过构造
2.make_shared
五.shared_ptr的主动释放
1.空
2.重置
六.shared_ptr的重置
1.空
2.其他指针
3.带删除器
七.shared_ptr的交换
八.shared_ptr的使用陷阱
#include <iostream>
using namespace std;
class girl;
class boy
{
public:
boy()
{
cout << "boy 构造函数!" << endl;
}
~boy()
{
cout << "boy 析构函数!" << endl;
}
void set_girlfriend(shared_ptr<girl>& sp)
{
m_sp = sp;
}
private:
shared_ptr<girl> m_sp;
};
class girl
{
public:
girl()
{
cout << "girl 构造函数!" << endl;
}
~girl()
{
cout << "girl 析构函数!" << endl;
}
void set_girlfriend(shared_ptr<boy>& sp)
{
m_sp = sp;
}
private:
shared_ptr<boy> m_sp;
};
void use_trap()
{
shared_ptr<boy>b(new boy());
shared_ptr<girl>g(new girl());
b->set_girlfriend(g);
g->set_girlfriend(b);
}
int main()
{
use_trap();
system("pause");
return 0;
}
运行结果:
当智能指针被当做参数传给别人时,会多一个指向,计数加一.
即使这里智能指针的生命周期结束,但是还是不能将其释放内存.