智能指针
古人曰:好记性不如烂笔头。
引入概念
在C++的学习中,指针是一个帮助我们管理内存的工具。当我们为指针申请了一块内存之后,为了内存能够循环利用,我们也需要释放它。但是实在开发中,繁琐的程序往往会让我们遗忘,故引入智能指针。智能指针的工作就是,在它被销毁的时候且内存没有被其他指针指向,会自动释放没有其他指针引用的内存块。
常见的智能指针(C++11)
shared_ptr
- 定义
顾名思义,就是多个shared_ptr可以指向同一块内存。
- 使用
1
2
3
4
5
6
7
8
9
10//create
shared_ptr<T> p;
shared_ptr<T> p = make_shared<T>();
shared_ptr<T> p = make_shared<T>(ags);
shared_ptr<T> p = make_shared<T>(n,ags); //n个ags
shared_ptr<T> p(new T(val));
shared_ptr<T> p(q);
shared_ptr<T> p(u); //u是unique_ptr,赋值给p后,因已不是唯一,u被置空。
shared_ptr<T> p(q,d); - 其他操作
Name | Description |
---|---|
p.get() | 返回p中保存的指针 |
p.reset(q) | 将p指向q |
p.reset(q,d) | d为lamda表达式([capture list](parameter list) -> return type{function type} ),p会执行该表达式 |
swap(q,p)/ p.swap(q) | 交换p和q的指针 |
unique_ptr
- 定义
与shared_ptr不同,它表示这一块内存只归该指针所有。
- 使用
1
2
3unique_ptr<T> u;
unique_ptr<T,D> u;
unique_ptr<T,D> u(d); - 其他操作
Name | Description |
---|---|
u.release() | 将指针置空(空悬指针) |
u.reset(q) | 若q为内置指针,令u指向这个对象,否则,置为空 |
weak_ptr
- 定义
它可以看作是另一种shared_ptr, 但是当它指向一块shared_ptr - 创建
1
2weak_ptr<T> w;
weak_ptr<T> w(sp); - 其他操作
Name | Description |
---|---|
w.use_count() | 与w共享的shared_prt的数量 |
w.expired() | count为0,返回true,否则为false |
w.lock() | expired为true,返回空,否则返回w指向的shared_ptr |