日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【数据结构学习之完全从零实现所有数据结构的代码编写之二】智能指针

發布時間:2023/12/10 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构学习之完全从零实现所有数据结构的代码编写之二】智能指针 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天我們依然暫時不講解數據結構里面的內容,我們來復習一下昨天學的模板技術用于數據結構編程的思想,給出一個模板技術的實例:智能指針的應用。喜歡看我分享的加我q:1126137994 加我共同學習交流各種技術。

為什么會引入智能指針呢?原因是在軟件開發中最可恨最常見的BUG:內存泄漏!是什么導致內存泄漏?

-動態申請堆空間,用完后不歸還
-C++語言中,沒有垃圾回收機制
-指針無法控制堆空間的生命周期

那么引入智能指針后,智能指針能做什么呢?

-指針生命周期結束時,主動釋放堆空間
-一片堆空間,最多只能由一個指針標識
-杜絕指針運算和指針比較

智能指針的設計方案:
-通過類模板描述指針的行為
*能夠定義不同類型的指針對象
-重載指針特征操作符(->和*)
*利用對象模擬原生指針的行為

重要說明:智能指針只能用來指向堆空間中的單個對象或者變量

下面給出代碼示例,我主要做的是在QT編譯器中建立了一個C++工程庫,以后所有的數據結構的代碼,都在這個庫里實現:
頭文件(SmartPointer.h):

#ifndef SMARTPOINTER_H #define SMARTPOINTER_Hnamespace DTLib {template <typename T> //開始泛型編程 class SmartPointer { protected:T* m_pointer; //T類型指針public:SmartPointer(T* p = NULL){m_pointer = p; //首先將m_pointer置空}SmartPointer(const SmartPointer<T>& obj) //拷貝構造函數,實現一片堆空間只能由一個指針標識{m_pointer = obj.m_pointer;const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;}SmartPointer<T>& operator = (const SmartPointer<T>& obj){if (this != &obj) //判斷是否自賦值,不能做比較運算,this當前的對象{delete m_pointer;m_pointer = obj.m_pointer;const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;}return *this; //可以支持連續的賦值}T* operator-> () //重載->操作符,讓T對象可以代表指針m_pointer{return m_pointer;}T& operator* () //重載*操作符,{return *m_pointer;}bool isNull() //判斷是否銷毀指針{return (m_pointer == NULL);}T* get() {return m_pointer;}~SmartPointer() //析構函數,很重要,對象的生命周期結束時主動的銷毀指針{delete m_pointer;}};}#endif // SMARTPOINTER_H

main.cpp函數:

#include <iostream> #include "SmartPointer.h"using namespace std; using namespace DTLib; //使用我們定義的命名空間class Test { public:Test() {cout << "Test()" << endl; //測試試驗,僅打印語句}~Test(){cout << "~Test()" << endl; //測試試驗,僅打印語句} };int main() {SmartPointer<Test> sp = new Test(); //聲明一個智能指針sp指向Test對象所對應的的堆空間//SmartPointer<Test> nsp; //又定義了一個智能指針//nsp = sp; //該智能指針指向sp指向Test對象所對應的的堆空間//cout << sp.isNull() << endl;//cout << nsp.isNull() << endl;return 0; }

運行上面程序,顯示結果為:

可以看出,我們并沒有主動去歸還申請的堆空間,而是程序自動的調用了析構函數銷毀了Test對象所對應的申請的堆空間。

那么我們將注釋掉的那幾行加上,編譯運行:

可以看出,sp這個指針已經為空,nsp指針不為空,指向的是Test對象所對應的的堆空間,最后又將這個Test對象析構,銷毀堆空間。
當然如果我們在main函數里加上一個nsp++的運算,編譯就會報錯,因為我們已經禁止了智能指針的比較與運算。

那么到此為此,我們已經實現了智能指針的實例。

總結:
1.指針特征操作符(->和*)可以被重載
2.重載指針特征符能夠使用對象代替指針
3.智能指針只能用于指向堆空間中的指針
4.智能指針的意義在于最大程度的避免內存問題

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

總結

以上是生活随笔為你收集整理的【数据结构学习之完全从零实现所有数据结构的代码编写之二】智能指针的全部內容,希望文章能夠幫你解決所遇到的問題。

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