C/C++智能指针详解-创新互联
- 系列文章目录
- 前言
- 一、什么是智能指针?
- 二、使用方法
- 1.shared_ptr
- 2.unique_ptr
- 3.weak_ptr
前言
对C/C++学习感兴趣的可以看看这篇文章哦:C/C++教程
本章主要介绍C/C++中智能指针的使用方法
一、什么是智能指针?C/C++中,指针是一个非常重要的概念,其强大但也麻烦
麻烦之处就在于一旦你申请了内存,那就必须要手动去释放内容,否则就会造成内存泄漏
当然了,在代码量少的情况下你可能会不以为意,因为这点内存即使泄露了也根本看不出来,而且一旦程序执行结束,所有内存都会被系统释放
但如果一旦写比较大点的项目,内存管理就显得很重要了,比如QQ,微信等等,一般都是一直挂着的
如果挂几个小时就把电脑内存耗干净了,瞬间电脑变卡,谁还用啊
所以智能指针的作用就是防止我们麻痹大意忘记释放内存,帮助我们管理内存的
二、使用方法当然也有多次释放一个指针,导致程序崩溃的问题也能就此解决
虽然智能指针听着很高级,但使用起来并不算复杂,熟悉之后,其实和普通指针差别不大。但会更加好用
自C++11之后,智能指针共有三个:shared_ptr
、unique_ptr
、weak_ptr
看名字就知道,它是可以分享的指针,其使用方法很简单:
比如这里有一个类:
class User {public:
User() {cout<< "这是构造函数"<< endl;
}
~User()
{cout<< "这是析构函数"<< endl;
}
void TestFun() {cout<< "这是一个测试函数"<< endl;
}
};
然后使用共享智能指针:
#includeusing namespace std;
//上面的那个类可以放在这里
int main() {shared_ptrp(new User());
shared_ptrp1 = p;
shared_ptrp2 = p;
p->TestFun(); //调用函数的方式和指针一样
cout<< p.use_count()<< endl; //输出共享个数
}
即:通过模板参数,传入要构造的指针类型,然后在初始化的时候,就可以直接new
一个对象即可
因为是共享的,所以它还能互相赋值,并可以用函数use_count
返回当前共享的个数
其使用方法,如调用类的函数和属性之类的,就和普通的指针一样,用->
进行调用即可,但是却不需要我们去亲自清理内存了!
看,现在我们并没有清理内存,但这个类的析构函数却被调用了!这就说明内存已经被正常释放了
这就是智能指针的好处!
但智能指针写着有点麻烦,每次声明其类型都有一长串,所以一般我们会对指针进行重定义,达到简化的目的:
typedef shared_ptrSPUser;
int main() {SPUser p(new User());
SPUser p1 = p;
SPUser p2 = p;
p->TestFun(); //调用函数的方式和指针一样
cout<< p.use_count()<< endl; //输出共享个数
}
2.unique_ptr上面的共享指针的使用方法和普通指针区别并不大
但有时候,我们想要某个对象同时只能存在一份,即不允许像共享指针那样,可以到处随意赋值给别人
这时候就可以用unique_ptr
,其使用方法如下:
typedef unique_ptrUPUser; //重新定义一个名称,便于使用
int main() {UPUser p(new User);
//UPUser p1 = p; //错误,不能进行赋值
UPUser p2;
p2.swap(p); //但可以交换,即p2现在保存有变量,但p变为了空指针
if (p == nullptr) {cout<< "p为空指针"<< endl;
}
p2->TestFun(); //正常调用
UPUser p3 = move(p2); //也可以用move函数移动
if (p2 == nullptr) {//此时p2就是空指针
cout<< "p2为空指针"<< endl;
}
p3->TestFun(); //p3则保存对象指针
}
可以看到,它的使用方法其实和共享指针是差不多的,唯一不同之处就是,它内部的指针值,同一时刻只能存在一份
即,你不能对它进行任何形式的复制,但是可以移动
3.weak_ptr这个智能指针用的不太多,因为它本身并没有太多实际的用途,而是主要作为shared_ptr
的一个辅助类存在
比如有多少指向相同的
shared_ptr
指针、shared_ptr
指针指向的堆内存是否已经被释放等等。
其使用方法如下:
typedef shared_ptrSPUser;
typedef weak_ptrWPUser;
int main() { SPUser p(new User());
SPUser p1 = p;
SPUser p2 = p;
WPUser wp(p);
cout<< wp.use_count()<< endl; //查看这个共享指针使用次数
cout<< wp.expired()<< endl; //判断这个指针是否为空,或者内存已经被释放
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文标题:C/C++智能指针详解-创新互联
文章链接:http://pwwzsj.com/article/djsoic.html