日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++深度剖析教程16】智能指针的分析

發布時間:2023/12/10 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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; }

上面的程序運行結果為:

運行結果確實沒有問題,但是仔細分析這個程序,我們就會發現,我們申請了堆空間之后,程序結束后,沒有釋放,也沒有調用析構函數。我們這里只運行了五次循環,看不出內存的泄漏問題,如果是在大型程序中,出現這樣的錯誤,長時間運行后,肯定會出現內存泄漏的問題。

那么我們就要來解決這個問題,我們的目標要求是什么呢?
*需要一個特殊的指針
*指針生命周期結束時主動釋放堆空間
*一個堆空間只能由一個指針標識,這樣可以防止多次釋放指針,造成程序崩潰
*杜絕指針運算和指針比較

針對以上的要求,我們給出以下解決方案:
-重載指針操作符(->和*),讓類對象可以像指針一樣使用它們
-只能通過類的成員函數來重載指針操作符
-重載函數不能使用參數
-只能定義一個重載函數(這與不能使用參數是一個道理)

以上的解決方案,實際上就是我們需要的智能指針啦!!!
那么什么是智能指針呢?我們還是先來從程序來慢慢分析,慢慢理解智能指針的概念。

#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;} };class Pointer {Test* mp; public:Pointer(Test* p = NULL){mp = p;}Pointer(const Pointer& obj){mp = obj.mp;const_cast<Pointer&>(obj).mp = NULL; //只能有一個指針指向堆空間}Pointer& operator = (const Pointer& obj){if( this != &obj ){delete mp;mp = obj.mp;const_cast<Pointer&>(obj).mp = NULL;}return *this;}Test* operator -> (){return mp;}Test& operator * (){return *mp;}bool isNull(){return (mp == NULL);}~Pointer(){delete mp;} };int main() {Pointer p1 = new Test(0);cout << p1->value() << endl;Pointer p2 = p1;cout << p1.isNull() << endl;cout << p2->value() << endl;return 0; }

運行結果為:

由以上程序的運行結果以及程序的本身可以看出,智能指針真的很強大,我們不再需要像C語言中那么復雜的去操作指針,只需要在這里操作對象,就可以達到指針操作的目的。同時,在程序結束時,指針也自動的被釋放,這樣就避免了內存泄漏的問題。同時,我們的程序也不允許出現指針的(對象的)比較與運算,這樣,就不會因為指針的運算導致出現野指針的情況了~~~

總結:
-指針特征操作符(->和*)可以被重載
-重載指針操作符可以是對象代替指針
-智能指針只能用于指向堆空間中的內存
-智能指針的最大意義在于最大限度的避免了內存泄漏的問題

想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。

總結

以上是生活随笔為你收集整理的【C++深度剖析教程16】智能指针的分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。