1. 程式人生 > >C++中的智慧指標(smart pointer)

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