C++总结笔记(十二)—— 智能指针
文章目錄
- 前言
- 一、智能指針是什么?
- 二、示例
- 總結(jié)
前言
C++對于內(nèi)存管理的要求很高,如果不及時(shí)釋放對象內(nèi)存,就可能會(huì)發(fā)生內(nèi)存泄露或野指針等情況,鑒于這種情況,C++11提出了智能指針的概念。
一、智能指針是什么?
智能指針可以將指針封裝為一個(gè)棧對象,當(dāng)不需要使用時(shí),會(huì)在析構(gòu)函數(shù)中釋放掉申請的內(nèi)存,所有的智能指針類均包含于頭文件 < memory> 內(nèi)。
其原理是:通過重載*,->,(),=運(yùn)算符來完成普通指針的功能,并定義了一些成員函數(shù),如reset,swap ,use_count,get等。
C++ 常見的有三種智能指針:unique_ptr、shared_ptr、weak_ptr。
另外還有一個(gè)auto_ptr目前已不推薦使用,原因是經(jīng)常會(huì)誤用其指針賦值功能(將指向的對象轉(zhuǎn)移到賦值的指針下,之前的指針會(huì)指向NULL)造成內(nèi)存錯(cuò)誤。
其中:
unique_ptr聲明的指針只能指向唯一的對象,不能賦值給其他指針,但可以使用move方法移動(dòng)內(nèi)存到另一個(gè)指針指向的內(nèi)存里。當(dāng)對象銷毀時(shí)會(huì)釋放其持有的堆內(nèi)存。
shared_ptr表示該類型的指針變量可以共享內(nèi)存對象,同時(shí)可以使用use_count來統(tǒng)計(jì)引用次數(shù)。
std::weak_ptr 表示指針不控制對象的生命周期,只用于訪問對象。其目的是協(xié)助 std::shared_ptr 工作,構(gòu)造和析構(gòu)不會(huì)引起引用計(jì)數(shù)的增加或減少,可以解決shared_ptr 互相引用導(dǎo)致的死鎖問題。該類型指針沒有重載*和->運(yùn)算符,但可以使用expired方法來判斷weak_ptr的對象是否被釋放。多應(yīng)用于事件對象的聲明中。
二、示例
#include<iostream> #include <memory> using namespace std;void test1() {//1unique_ptr<int> p1(new int(1));cout << *p1 << endl;//2unique_ptr<int> p2;p2.reset(new int(2));cout << *p2 << endl;//3,make_unique方法是C++14開發(fā)的unique_ptr<int> p3 = make_unique<int>(3);cout << *p3 << endl; }void test2() {//1shared_ptr<int> p1(new int(1));cout << *p1 << endl;//use_count方法用于獲取當(dāng)前資源的引用計(jì)數(shù)cout << "use count: " << p1.use_count() << endl;//2shared_ptr<int> p2;p2.reset(new int(2));cout << *p2 << endl;//3shared_ptr<int> p3;p3 = make_shared<int>(3);cout << *p3 << endl;//4,可以拷貝和賦值p1的資源shared_ptr<int> p4(p1);cout << *p4 << endl;//use_count方法用于獲取當(dāng)前資源的引用計(jì)數(shù)cout << "use count: " << p4.use_count() << endl;shared_ptr<int> p5 = p1;cout << *p5 << endl;//use_count方法用于獲取當(dāng)前資源的引用計(jì)數(shù)cout << "use count: " << p5.use_count() << endl; }void test3() {//創(chuàng)建一個(gè)shared_ptr指針shared_ptr<int> p1(new int(1));cout << *p1 <<endl;//將shared_ptr指針拷貝給weak_ptr指針weak_ptr<int> p2(p1);cout << "use count: " << p1.use_count() << endl;//賦值weak_ptr<int> p3 = p1;cout << "use count: " << p1.use_count() << endl; }int main() {/*test1();*//*test2();*/test3();system("pause");return 0; }總結(jié)
使用智能指針需要注意其使用場合。聲明不需共享的對象,使用unique_ptr,需要共享,則使用shared_ptr,需要的時(shí)候用,不需要的時(shí)候不用,可以使用weak_ptr。
總結(jié)
以上是生活随笔為你收集整理的C++总结笔记(十二)—— 智能指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql函数(五.流程控制函数)
- 下一篇: ubuntu 黑体_Ubuntu安装文泉