文章目錄
- 前言
- 一、智能指針是什么?
- 二、示例
- 總結
前言
C++對于內存管理的要求很高,如果不及時釋放對象內存,就可能會發生內存泄露或野指針等情況,鑒于這種情況,C++11提出了智能指針的概念。
一、智能指針是什么?
智能指針可以將指針封裝為一個棧對象,當不需要使用時,會在析構函數中釋放掉申請的內存,所有的智能指針類均包含于頭文件 < memory> 內。
其原理是:通過重載*,->,(),=運算符來完成普通指針的功能,并定義了一些成員函數,如reset,swap ,use_count,get等。
C++ 常見的有三種智能指針:unique_ptr、shared_ptr、weak_ptr。
另外還有一個auto_ptr目前已不推薦使用,原因是經常會誤用其指針賦值功能(將指向的對象轉移到賦值的指針下,之前的指針會指向NULL)造成內存錯誤。
其中:
unique_ptr聲明的指針只能指向唯一的對象,不能賦值給其他指針,但可以使用move方法移動內存到另一個指針指向的內存里。當對象銷毀時會釋放其持有的堆內存。
shared_ptr表示該類型的指針變量可以共享內存對象,同時可以使用use_count來統計引用次數。
std::weak_ptr 表示指針不控制對象的生命周期,只用于訪問對象。其目的是協助 std::shared_ptr 工作,構造和析構不會引起引用計數的增加或減少,可以解決shared_ptr 互相引用導致的死鎖問題。該類型指針沒有重載*和->運算符,但可以使用expired方法來判斷weak_ptr的對象是否被釋放。多應用于事件對象的聲明中。
二、示例
#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開發的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方法用于獲取當前資源的引用計數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方法用于獲取當前資源的引用計數cout << "use count: " << p4.use_count() << endl;shared_ptr<int> p5 = p1;cout << *p5 << endl;//use_count方法用于獲取當前資源的引用計數cout << "use count: " << p5.use_count() << endl;
}void test3()
{//創建一個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;
}
總結
使用智能指針需要注意其使用場合。聲明不需共享的對象,使用unique_ptr,需要共享,則使用shared_ptr,需要的時候用,不需要的時候不用,可以使用weak_ptr。