C++中的智慧指標(smart pointer)
指標問題是在學習C++,以及運用C++進行軟體開發過程中經常碰到的問題。其中之一,就是“懸垂指標”。所謂懸垂指標,就是是指指標指向了一塊沒有分配給使用者使用的記憶體,結果未定義,往往導致程式錯誤,而且難以檢測。
用一個簡單的例子來說明懸垂指標:
string *sp = new string("Test dangling pointer");
string *dp = sp;
delete sp;
//此時會發生嚴重的錯誤
delete dp;
由於指標dp所指向的記憶體單元已經被指標sp釋放,再次釋放將會產生嚴重的問題
為了解決C++中懸垂指標的問題,引入“智慧指標(smart pointer)
圖示說明:
智慧指標類將一個計數器與類指向的物件相關聯,使用計數跟蹤該類有多少個物件共享同一指標。
1. 定義智慧指標類,假設基礎物件為string型別的物件
//定義只能指標類smartPtr class smartPtr { public: //建構函式 smartPtr(std::string *p): ptr(new cntPtr(p)) { } //複製建構函式 smartPtr(const smartPtr &orig): ptr(orig.ptr) { ++ptr->cnt; } //賦值操作符 smartPtr& operator=(const smartPtr&); //解構函式 ~smartPtr() { //只有在刪除最後一個指向基礎物件的指標時才釋放基礎物件 if (--ptr->cnt == 0) { delete ptr; } } private: cntPtr *ptr; };
2. 定義使用計數類
//定義使用計數類cntPtr
class cntPtr
{
//宣告智慧指標類smartPtr為其友元類
friend class smartPtr;
//指向string型別物件的指標sp
std::string *sp;
//計數器cnt
std::size_t cnt;
//建構函式
cntPtr(std::string *p): sp(p), cnt(1) { }
~cntPtr() { delete sp; }
};
3. 此時執行
smartPtr t_sp_1(new string("Test smart pointer")); smartPtr t_sp_2 = t_sp_1; //顯式呼叫解構函式(不推薦) t_sp_1.~smartPtr(); t_sp_2.~smartPtr();
將不會出現任何錯誤。
相關推薦
【C++】智慧指標(Smart Pointer)
1. 傳統指標存在的問題 傳統指標存在諸多的問題,比如指標所指向的物件的生命週期問題,掛起引用(dangling references),以及記憶體洩露(memory leaks). 如下是一個傳統指標的使用過程 void Foo() {
C++中的智慧指標(smart pointer)
指標問題是在學習C++,以及運用C++進行軟體開發過程中經常碰到的問題。其中之一,就是“懸垂指標”。所謂懸垂指標,就是是指指標指向了一塊沒有分配給使用者使用的記憶體,結果未定義,往往導致程式錯誤,而且難以檢測。 用一個簡單的例子來說明懸垂指標: string *sp = n
c++智慧指標(smart pointer)詳解
Smart Pointer Deal with c++11’s smart pointer facility. brief Smart pointers are class objects that behave like built-in
C++ 智慧指標(Smart Pointer)
智慧指標具有非常強大的能力,謹慎而明智的選擇能帶來極大的好處。我不否認智慧指標的能力,雖然我在之前的否認過auto_ptr。可能由於我自身能力的限制,體會不到auto_ptr的好處,但這樣的可能性我覺得已經不大了。但auto_ptr是最簡單的智慧指標,在它的周圍存在大量的作品
[C++] 什麼是智慧指標(Smart Pointer)以及何時使用
答案 1 智慧指標是一個類,它封裝了一個原始的C++指標,以管理所指物件的生命期。沒有單一的智慧指標型別,但所有這些都嘗試以實用的方式抽象原始指標。 智慧指標應優先於原始指標。 如果你覺得你需要使用指標(首先要考慮你是否真的需要指標),你通常會想要使用智慧指
C++深度探索系列:智慧指標(Smart Pointer) [二]
深度探索智慧指標(Smart Pointer) 主題索引: 一、剖析C++標準庫智慧指標(std::auto_ptr) 1.Do you Smart Pointer? 2
C++中智慧指標的設計和使用
原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235 智慧指標(smart pointer)是儲存指向動態分配(堆)物件指標的類,用於生存期控制,能夠確保自動正確的銷燬動態分配的物件,防止記憶體
智慧指標(smart pointer)(2):unique_ptr
Unique pointer: Manages the storage of a pointer, providing a limited garbage-collection facility, with little to no overhead ov
深度探索智慧指標(Smart Pointer)
主題索引: 一、剖析C++標準庫智慧指標(std::auto_ptr) 1.Do you Smart Pointer? 2.std::auto_ptr的設計原理 3.std::auto_ptr高階使用指南 4.你是否覺得std::auto_p
C++11中智慧指標的使用
1.C++11中新增了三種智慧指標,在初始化指標後,如果類被析構,那指標所指向的物件會被自動析構,方便了程式設計師對指標的控制。 share_ptr:共享的智慧指標 weak_ptr:配合share_ptr使用的弱指標 unique_ptr:獨佔的智慧指標 2.智
C++之智慧指標std::shared_ptr簡單使用和理解
1 智慧指標std::shared_ptr相關知識和如何使用 我們這裡先說下智慧指標std::shared_ptr,因為我看到我我們專案c++程式碼裡面用得很多,我不是不會,所以記錄學習下 先讓ubuntu終端支援c++11,如果自己的電腦還沒配置號,可以先看下我的這篇部落格
C++之智慧指標和普通指標單例模式兩種實現
1 問題 實現c++的單例模式,這裡測試分別寫了通過智慧指標返回物件和普通返回指標 2 程式碼測試 include <iostream> #include <mutex> #include <m
C++11智慧指標和引用
最近在學習課程的時候發現一個很困惑的問題,上程式碼 class DataHeader; class LoginResult:public DataHeader; typedef std::shared_ptr<DataHeader> DataHeaerPtr; //原型 void addS
淺談C++的智慧指標
我們使用智慧指標來自動執行管理記憶體,避免對原始指標的使用不當而造成記憶體洩漏。 ---------------------------------------------------------------------------------------------------------
C++ this指標的詳解 C++中this指標的用法詳解
C++中this指標的用法詳解 轉自:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指標的用處: 一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果
c++中this指標的用法詳解
為什麼引入this指標? 最簡單的應用場景就是:當我們在類中定義了一個變數,同時在類成員函式中定義了同一變數時,也就是說變數名重複時,但是我們想使用類中定義的變數,這個時候我們該怎麼辦呢?這個時候就是this指標大顯身手的時候了。為此我們引入this指標
C++【智慧指標】
智慧指標的作用: 堆記憶體的申請和釋放都由程式設計師自己管理。 普通指標:需要程式設計師手動釋放,容易造成記憶體洩漏(比如忘記手動釋放,或者程式異常)和二次釋放的問題。 智慧指標:程式結束自己釋放,不需要程式設計師手動釋放。所以不存在記憶體洩漏 智慧指標其實就是利用
c++ 之智慧指標:儘量使用std::make_unique和std::make_shared而不直接使用new
關於make_unique的構造及使用例程,MSDN的講解非常詳細 (https://msdn.microsoft.com/zh-cn/library/dn439780.aspx ) 使用過程中,主要有這麼幾個關鍵點: 1. make_unique 同 uni
《隨筆十七》—— C++中的 “ 指標詳解 ”
目錄 指標的概念 指標所指向的型別 指標的值 指標本身所佔據的記憶體區 指標的算術運算 運算子&和* 指標表示式 陣列和指標的關係 指標和結構型別的關係 指標和函式的關係
C++探索智慧指標
一、 RAII(Resource Acquisition Is Initialization) 資源分配即初始化,定義一個類來封裝資源的分配和釋放,在建構函式完成資源的分配和初始化,在解構函式完成資源的清理,可以保證資源的正確初始化和釋放。 RAII是一種思想,智慧指標是RAII