日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 程序喵大人

內(nèi)存管理一直是 C++ 中一個核心且復(fù)雜的話題。裸指針雖然操作直接,但極易出現(xiàn)內(nèi)存泄漏、重復(fù)釋放等問題。智能指針的出現(xiàn),是現(xiàn)代 C++ 提升代碼安全性和可維護(hù)性的利器。

這里帶你手寫一個簡易智能指針,幫助你真正理解智能指針的工作原理。

一、裸指針的困境

先來看一段典型的裸指針代碼:

void foo() {  MyClass* p = new MyClass();  // 業(yè)務(wù)邏輯  delete p; // 如果忘了,內(nèi)存泄漏 } 

如果 delete p 忘寫,程序就會內(nèi)存泄漏;如果寫了兩次,程序又可能崩潰。

裸指針的手動管理不但繁瑣,還容易引入難以察覺的錯誤。

二、智能指針的設(shè)計(jì)目標(biāo)

智能指針本質(zhì)是一個類,封裝裸指針,負(fù)責(zé):

  • 自動釋放資源,防止內(nèi)存泄漏
  • 明確資源所有權(quán),防止重復(fù)釋放
  • 操作簡潔,支持類似裸指針的訪問方式

三、手寫?yīng)氄贾悄苤羔?—— SimpleSmartPtr

我們先實(shí)現(xiàn)一個獨(dú)占式智能指針,它獨(dú)自擁有指針資源,不允許復(fù)制,只能移動。

template<typename T> class SimpleSmartPtr {  T* ptr;  public:  // 構(gòu)造函數(shù),默認(rèn)nullptr  explicit SimpleSmartPtr(T* p = nullptr) : ptr(p) {}   // 析構(gòu)函數(shù),釋放資源  ~SimpleSmartPtr() {  delete ptr;  }   // 禁止拷貝構(gòu)造和拷貝賦值,防止重復(fù)釋放  SimpleSmartPtr(const SimpleSmartPtr&) = delete;  SimpleSmartPtr& operator=(const SimpleSmartPtr&) = delete;   // 支持移動構(gòu)造,實(shí)現(xiàn)資源轉(zhuǎn)移  SimpleSmartPtr(SimpleSmartPtr&& other) noexcept : ptr(other.ptr) {  other.ptr = nullptr;  }   // 支持移動賦值,實(shí)現(xiàn)資源轉(zhuǎn)移  SimpleSmartPtr& operator=(SimpleSmartPtr&& other) noexcept {  if (this != &other) {  delete ptr; // 釋放原有資源  ptr = other.ptr; // 接管新資源  other.ptr = nullptr; // 置空舊指針  }  return *this;  }   // 解引用操作符,支持指針操作  T& operator*() const { return *ptr; }  T* operator->() const { return ptr; }   // 獲取裸指針  T* get() const { return ptr; } }; 

關(guān)鍵點(diǎn)詳解:

  • 構(gòu)造函數(shù) 接收一個裸指針,默認(rèn) nullptr。
  • 析構(gòu)函數(shù) 確保指針析構(gòu)時,資源自動釋放。
  • 禁止拷貝:防止多個智能指針同時管理同一資源,避免雙重釋放。
  • 支持移動:允許智能指針資源所有權(quán)轉(zhuǎn)移,防止資源浪費(fèi)。
  • 操作符重載:讓智能指針表現(xiàn)得像普通指針,方便使用。

四、為什么禁止拷貝?為什么要支持移動?

如果允許拷貝:

SimpleSmartPtrp1(new MyClass()); SimpleSmartPtrp2 = p1; // 拷貝,兩個智能指針指向同一個裸指針 

兩個智能指針都會在析構(gòu)時 delete 同一指針,導(dǎo)致重復(fù)釋放,程序崩潰。

移動語義允許資源所有權(quán)在智能指針之間安全轉(zhuǎn)移:

SimpleSmartPtrp2 = std::move(p1); // p2接管資源,p1置空 

這樣避免了重復(fù)釋放,也能靈活轉(zhuǎn)移資源。

五、引用計(jì)數(shù)智能指針 shared_ptr 基本思路

獨(dú)占式智能指針不能滿足多處共享對象需求。C++ 標(biāo)準(zhǔn)庫提供了 std::shared_ptr,通過引用計(jì)數(shù)實(shí)現(xiàn)資源共享管理。

核心原理是:

  • 引用計(jì)數(shù)存放在堆上,所有 shared_ptr 實(shí)例共享
  • 每次拷貝構(gòu)造/賦值計(jì)數(shù)加1,析構(gòu)計(jì)數(shù)減1
  • 計(jì)數(shù)為0時釋放資源

手寫引用計(jì)數(shù)智能指針雖然稍復(fù)雜,但思路簡單:增加一個計(jì)數(shù)器成員指針,管理引用次數(shù)。

六、weak_ptr 的角色

當(dāng)兩個對象相互持有 shared_ptr,就會產(chǎn)生循環(huán)引用,導(dǎo)致計(jì)數(shù)永遠(yuǎn)不為0,資源泄漏。

weak_ptr 是一種不增加引用計(jì)數(shù)的智能指針,專門用來觀察 shared_ptr,避免循環(huán)引用。

七、小結(jié)

通過手寫智能指針,你不僅能:

  • 理解 RAII(資源獲取即初始化)理念
  • 掌握移動語義、禁止拷貝的重要設(shè)計(jì)
  • 理解資源所有權(quán)與生命周期管理
  • 理解引用計(jì)數(shù)智能指針的基本原理

還能讓你寫出更安全、高效、易維護(hù)的現(xiàn)代 C++ 代碼。



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉