一、前言
C/C++中,指针是一个非常重要的概念,其强大但也麻烦,对指针不熟悉的可以看看这篇文章:指针与引用。
它的麻烦之处就在于一旦你申请了内存,那就必须要手动去释放它,否则就会造成内存泄漏。
当然了,在代码量少的情况下你可能会不以为意,因为这点内存即使泄露了也根本看不出来,并且一旦程序执行结束,所有内存都会被系统释放掉。
但如果写比较大点的项目,内存管理就显得很重要了,比如QQ,微信等等,一般都是一直挂着的,如果挂几个小时就把电脑内存耗干净了,瞬间电脑变卡,谁还用啊。
所以智能指针的作用就是防止我们忘记释放内存,帮助我们管理内存的。
当然也有多次释放一个指针,导致程序崩溃的问题也能就此解决。
而且很多C/C++岗位,在面试C/C++内容时,基本也都会考量对指针指针的理解程度。
二、使用方法
虽然智能指针听着很高级,但使用起来并不算复杂,熟悉之后,其实和普通指针差别不大,甚至会更加好用。
自C++11
之后,智能指针共有三个:shared_ptr
、unique_ptr
、weak_ptr
。
其所在的头文件为:memory
。
但由于vs
自动包含了这个头文件,所以可以直接使用。
1.shared_ptr
看名字就知道,它是可以分享的指针,其使用方法很简单,比如这里有一个类:
class User {
public:
User() {
cout << "这是构造函数" << endl;
}
~User()
{
cout << "这是析构函数" << endl;
}
void TestFun() {
cout << "这是一个测试函数" << endl;
}
};
然后使用共享智能指针:
#include<iostream>
using namespace std;
//上面的那个类可以放在这里
int main() {
shared_ptr<User> p(new User());
shared_ptr<User> p1 = p;
shared_ptr<User> p2 = p;
p->TestFun(); //调用函数的方式和指针一样
cout << p.use_count() << endl; //输出共享个数
}
使用方法就是,通过模板参数传入要构造的指针类型,然后在初始化的时候,就可以直接new
一个对象指针进去即可。
因为是共享的,所以它还能互相赋值,并可以用函数use_count
返回当前共享的个数。
其使用方法,如调用类的函数和属性之类的,就和普通的指针一样,用->
进行调用即可,但是却不需要我们去亲自清理内存了!
现在我们并没有清理内存,但这个类的析构函数却被调用了,这就说明内存已经被正常释放了!
而这就是智能指针的好处。
但智能指针写着有点麻烦,每次声明其类型都有一长串,所以一般我们会对智能指针进行重定义,达到简化书写的目的:
typedef shared_ptr<User> SPUser;
int main() {
SPUser p(new User());
SPUser p1 = p;
SPUser p2 = p;
p->TestFun(); //调用函数的方式和指针一样
cout << p.use_count() << endl; //输出共享个数
}
2.unique_ptr
上面的共享指针的使用方法和普通指针区别并不大。