【C++深度剖析教程16】智能指针的分析
今天我們來學習C++中的一個獨有的特性,智能指針。智能指針的作用非常的強大,它解決了C++語言關于指針部分內存泄漏的BUG。那么在此處,內存泄漏指的是什么呢?
-動態申請堆空間,用完后不歸還
-C++語言中沒有垃圾回收機制
-指針無法控制所有堆空間的生命周期
下面我們以一個程序的例子來說明,內存泄漏大概會發生什么情況:
#include <iostream> #include <string>using namespace std;class Test {int i; public:Test(int i){cout << "Test(int i)" << endl;this->i = i;}int value(){return i;}~Test(){cout << "~Test()" << endl;} };int main() {for(int i = 0;i<5;i++){Test* p = new Test(i);cout << p->value() << endl;}return 0; }上面的程序運行結果為:
運行結果確實沒有問題,但是仔細分析這個程序,我們就會發現,我們申請了堆空間之后,程序結束后,沒有釋放,也沒有調用析構函數。我們這里只運行了五次循環,看不出內存的泄漏問題,如果是在大型程序中,出現這樣的錯誤,長時間運行后,肯定會出現內存泄漏的問題。
那么我們就要來解決這個問題,我們的目標要求是什么呢?
*需要一個特殊的指針
*指針生命周期結束時主動釋放堆空間
*一個堆空間只能由一個指針標識,這樣可以防止多次釋放指針,造成程序崩潰
*杜絕指針運算和指針比較
針對以上的要求,我們給出以下解決方案:
-重載指針操作符(->和*),讓類對象可以像指針一樣使用它們
-只能通過類的成員函數來重載指針操作符
-重載函數不能使用參數
-只能定義一個重載函數(這與不能使用參數是一個道理)
以上的解決方案,實際上就是我們需要的智能指針啦!!!
那么什么是智能指針呢?我們還是先來從程序來慢慢分析,慢慢理解智能指針的概念。
運行結果為:
由以上程序的運行結果以及程序的本身可以看出,智能指針真的很強大,我們不再需要像C語言中那么復雜的去操作指針,只需要在這里操作對象,就可以達到指針操作的目的。同時,在程序結束時,指針也自動的被釋放,這樣就避免了內存泄漏的問題。同時,我們的程序也不允許出現指針的(對象的)比較與運算,這樣,就不會因為指針的運算導致出現野指針的情況了~~~
總結:
-指針特征操作符(->和*)可以被重載
-重載指針操作符可以是對象代替指針
-智能指針只能用于指向堆空間中的內存
-智能指針的最大意義在于最大限度的避免了內存泄漏的問題
想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。
總結
以上是生活随笔為你收集整理的【C++深度剖析教程16】智能指针的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA API中文在线帮助文档
- 下一篇: 【C++深度剖析教程15】经典问题解析之