c++的智能指针
智能指针
-
什么是智能指针:
智能指针就是可以自己进行指针地址的创建和销毁的指针,在智能指针中,当需要开辟空间时它可以自己new一个空间来调用地址,并且在不需要的时候或者空着的时候自动delete内存空间。在使用智能指针时我们基本不需要使用new,所以智能指针的代码风格也很工整清爽。在编写代码时可以自动化管理内存。
-
智能指针的分类(智能指针包含在memory头文件中):
- unique_ptr(作用域指针):unique_ptr只能有一个,不能复制一个一样的指针,否则有其中一个释放时,另一个就会指向那个被释放的区域,会报错。在使用unique_ptr时我们对类的实例化过程时只能显示构造函数,不能进行隐式构造。
- 语法:std::unique_ptr<参数模板> 名字 =std::make_unique<参数模板>();
例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Entity
{
public:
Entity()
{
std::cout << "Creat a Entity!" << std::endl;
}
~Entity()
{
std::cout << "Destory a Entity!" << std::endl;
}
Print()
{
std::cout << "This is an Entity!" << std::endl;
}
}
int main ()
{
{
std::unique_ptr<Entity> entity(new Entity());//第一种创建方法
std::unique_ptr<Entity> entity = std::make_unique<Entity>();//第二种创建方法(有时可能出于异常时使用此方法,即由于构造函数出现异常时指针会为空)
entity->Print();//像正常函数一样调用即可
}//当离开这个作用域时这个指针会自动销毁
}- shared_ptr(共享指针):sharing_ptr的使用取决于使用的编译器和其中的标准库,大多数情况下,他是作为引用计数(一种用来统计你的指针有多少引用的方法)在引用计数中一旦计数为0则会自动销毁。例如用了两次sharing_ptr则引用计数为2,如果其中一个被释放了那么为1,直到最后一个也被释放才会自动销毁。
- 语法:std::shared_ptr<参数模板> 名字 =std::make_shared<参数模板>();
例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Entity
{
public:
Entity()
{
std::cout << "Creat a Entity!" << std::endl;
}
~Entity()
{
std::cout << "Destory a Entity!" << std::endl;
}
Print()
{
std::cout << "This is an Entity!" << std::endl;
}
}
int main ()
{
{
std::shared_ptr<Entity> e0;
{
//std::shared_ptr<Entity> entity(new Entity());//第一种创建方法
std::shared_ptr<Entity> entity = std::make_shared<Entity>();//第二种创建方法,在这种方法中不写new是因为异常安全
e0 = entity;//支持复制
}//在出这个作用域时entity就会销毁,但是e0依旧存活
}
}- weak_ptr:一般与shared_ptr连用,因为当shared_ptr赋值给weak_ptr时不会增加引用次数,这样可以通过weak_ptr去判断底层对象是否还存在。所有有可能weak_ptr会指向一个无效对象。
资料来源
youtube上the cherno的c++系列
评论






