<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C++是一種廣泛使用的程式語言,它允許程式設計師使用動態分配的記憶體。然而,手動管理記憶體可能會導致一些嚴重的問題,如記憶體漏失和懸空指標。為了解決這些問題,C++引入了智慧指標的概念。智慧指標是一種特殊的指標型別,它可以自動管理記憶體並確保在不需要時釋放記憶體。智慧指標在 C++程式中的使用已經變得越來越普遍,例如在 STL 容器中使用的智慧指標、COM 介面程式設計等。
本文將介紹智慧指標的概念、型別以及實現原理,幫助大家更好地理解和應用智慧指標。
智慧指標是一種 C++語言特有的指標,它是對常規指標的封裝,提供了自動記憶體管理的功能,能夠在物件不再被使用時自動釋放其所佔用的記憶體,避免了手動管理記憶體所帶來的錯誤和麻煩。智慧指標的設計思想是資源管理類(RAII)的一種應用,通過將物件的生命週期與智慧指標的生命週期繫結,實現對物件的自動管理。
與常規指標相比,智慧指標具有以下特點:
然而,智慧指標也有一些缺點:
智慧指標的生命週期由其作用域和參照計數共同決定。當智慧指標物件超出作用域時,會自動釋放其所指向的記憶體,從而避免了記憶體漏失的問題。而當多個智慧指標指向同一個物件時,其參照計數會增加,當參照計數為 0 時,物件才會被釋放。也就是說,智慧指標的作用域和生命週期是自動管理的,能夠有效避免記憶體漏失和其他記憶體管理問題的出現。
C++中常見的智慧指標型別有 unique_ptr、shared_ptr 和 weak_ptr。
unique_ptr
:在不需要共用所有權的情況下,儘量使用 unique_ptr。它可以確保指標所有權唯一,避免記憶體漏失的發生,並且具有良好的效能。shared_ptr
管理共用資源:在需要多個物件共用同一個資源時,應該使用shared_ptr
。shared_ptr
使用參照計數技術,可以確保資源只有在最後一個擁有者被銷燬時才會被釋放。make_shared
或make_unique
建立智慧指標:在建立智慧指標時,應該儘可能地使用 make_shared
或 make_unique
函數,而不是直接使用 new 操作符。這樣可以減少記憶體分配的開銷,並且可以避免記憶體漏失的發生。vector
。const
參照:當需要將智慧指標作為引數傳遞給函數時,應該儘量使用const
參照,以避免不必要的拷貝和記憶體分配。#include <iostream> #include <memory> using namespace std; class MyClass { public: void print() { cout << "Hello from MyClass!" << endl; } }; void test_unique_ptr() { unique_ptr<MyClass> p(new MyClass()); p->print(); } void test_shared_ptr() { shared_ptr<MyClass> p(new MyClass()); p->print(); } void test_weak_ptr() { shared_ptr<MyClass> p1(new MyClass()); weak_ptr<MyClass> p2(p1); if (!p2.expired()) { shared_ptr<MyClass> p3 = p2.lock(); p3->print(); } } int main() { test_unique_ptr(); test_shared_ptr(); test_weak_ptr(); return 0; }
上述程式碼中,我們定義了一個名為 MyClass 的類,其範例擁有一個 print() 方法,用於列印一條訊息。
接著,我們定義了三個測試函數:test_unique_ptr()、test_shared_ptr() 和 test_weak_ptr(),分別使用了 unique_ptr、shared_ptr 和 weak_ptr 智慧指標型別。
在 test_unique_ptr() 中,我們使用了 unique_ptr,它擁有獨佔的所有權,用於管理 MyClass 型別的範例。我們使用 new 運運算元來建立這個範例,然後使用箭頭操作符存取它的 print() 方法。
在 test_shared_ptr() 中,我們使用了 shared_ptr,它可以與其他 shared_ptr 共用同一個範例。我們同樣使用 new 運運算元建立 MyClass 型別的範例,並傳遞給 shared_ptr,它會自動跟蹤範例的參照計數。同樣,我們使用箭頭操作符存取範例的 print() 方法。
在 test_weak_ptr() 中,我們定義了一個 shared_ptr 型別的範例 p1,然後建立了一個指向它的 weak_ptr 型別的範例 p2。由於 weak_ptr 並不會增加參照計數,因此它不能直接存取 MyClass 範例,需要先通過 lock() 方法獲取一個 shared_ptr 型別的範例 p3,然後才能使用箭頭操作符存取範例的 print() 方法。
通過上述範例,我們可以看到不同型別的智慧指標的使用方法和特點。需要注意的是,在實際開發中,我們需要根據具體的場景和需求,選擇最合適的智慧指標型別,以達到最佳的效果。
智慧指標是一種 C++中常用的記憶體管理工具,能夠自動管理物件的生命週期,有效避免記憶體漏失和資源佔用等問題。本文主要介紹了普通指標和智慧指標的區別,以及智慧指標的分類和特點。我們對每種型別進行了介紹和比較,指出了它們的適用場景和注意事項。
在實際應用中,我們應該根據具體場景選擇合適的智慧指標型別,並注意避免智慧指標的陷阱,如迴圈參照和多執行緒環境下的競爭問題。同時,我們還可以利用智慧指標的一些高階用法和技巧,如自定義刪除器和指標轉換操作等。總之,智慧指標是 C++中一個非常實用的工具,能夠幫助我們更加高效地管理記憶體和資源。
RAII(Resource Acquisition Is Initialization)是一種 C++程式設計技術,它利用物件的生命週期來管理資源,包括記憶體、檔案、網路連線等。智慧指標就是利用 RAII 技術來管理記憶體資源的一種實現。
RAII 技術的基本原則是:在建構函式中獲取資源,在解構函式中釋放資源。智慧指標通過在解構函式中釋放資源,實現了自動管理記憶體資源的功能。
參考
learn.microsoft.com/en-us/cpp/c…
以上就是通過範例詳解C++智慧指標的詳細內容,更多關於C++ 智慧指標的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45