欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

智能指針的簡單剖析和實現(xiàn)-創(chuàng)新互聯(lián)

在C語言中我們用指針來進行內(nèi)存管理,這也是C語言的強大之處。然而,也正是指針的存在使得C語言變得令人懊惱,內(nèi)存泄漏、垂懸指針等等問題。強大的C++則采用智能指針(Smart_Ptr)來處理這個問題.

創(chuàng)新互聯(lián)2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元延川做網(wǎng)站,已為上家服務(wù),為延川各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

好了,什么是智能指針呢?智能指針的行為類似常規(guī)指針,重要的區(qū)別是它負責(zé)自動釋放所指向的對象。這樣以防止內(nèi)存泄漏。

智能指針都有哪些種類呢?

智能指針的簡單剖析和實現(xiàn)

通過上述表格可以看出有如此多的智能指針,C11標(biāo)準庫已經(jīng)引進unique_ptr/shared_ptr/weak_ptr供我們使用。

下面來簡單談?wù)勥@些指針的原理和實現(xiàn)。

First——>auto ptr

auto ptr的實現(xiàn)原理主要是管理權(quán)的轉(zhuǎn)移。它是所擁有的對象的唯一擁有者,也就是一個對象只有一個擁有者。

代碼實現(xiàn):

template <class T>
class AutoPtr
{
public:
	AutoPtr(T* Ptr)
		:_Ptr(Ptr)
	{}

	~AutoPtr()
	{
		if(_Ptr!=NULL)
		{
			delete _Ptr;
		}
	}

	AutoPtr(AutoPtr<T>& ap)
	{
		_Ptr=ap._Ptr;
		ap._Ptr=NULL;
	}

	AutoPtr<T> operator=(AutoPtr<T>& ap)
	{
		if(&ap!=this)
		{
			delete _Ptr;
			_Ptr=ap._Ptr;
			ap._Ptr=NULL;
		}
		return *this;
	}

	T& operator*()
	{
		return *_Ptr;
	}

	T* operator->()
	{
		return _Ptr;
	}
private:
	T* _Ptr;
};

通過代碼我們可以看出由于auto ptr指針唯一性,即一個對象只能有一個auto ptr指針?biāo)赶蛩?。因此,?dāng)auto ptr以傳值方式被作為參數(shù)傳遞給某函數(shù)時,這時對象的原來擁有者就放棄了對象的擁有權(quán),把它轉(zhuǎn)移到被調(diào)用函數(shù)中的參數(shù)上,如果函數(shù)不再將擁有權(quán)傳遞出去,由于形參的作用域僅僅為函數(shù)內(nèi)部,當(dāng)函數(shù)退出時,它所指向的對象將被銷毀。當(dāng)函數(shù)返回一個auto ptr時,其擁有權(quán)又被轉(zhuǎn)移到了調(diào)用端。因此,我們盡量不要使用auto ptr傳參,或者引用傳遞。此外,auto ptr 還不能作為容器的成員,C++標(biāo)準明確禁止這樣做。

Second——>scoped ptr

scoped ptr與auto ptr類似,它實現(xiàn)的原理則是防拷貝,也就是它不能轉(zhuǎn)移管理權(quán),所以不能被賦值或者拷貝構(gòu)造。那么,我們可以將拷貝構(gòu)造和賦值運算符重載函數(shù)只聲明不實現(xiàn),并將其聲明為保護,那么也就防止了別人在類外實現(xiàn)它。

代碼實現(xiàn):

template <class T>
class ScopedPtr
{
public:
	ScopedPtr(T* Ptr)
		:_Ptr(Ptr)
	{}

	~ScopedPtr()
	{
		if(_Ptr!=NULL)
		{
			delete _Ptr;
		}
	}

	T& operator*()
	{
		return *_Ptr;
	}

	T* operator->()
	{
		return _Ptr;
	}
protected:
	T* _Ptr;
	ScopedPtr(ScopedPtr<T>& sp);
	ScopedPtr<T>& operator=(ScopedPtr<T>& sp);
};

通過代碼可以看出scoped ptr 的實現(xiàn)十分的簡單粗暴,動態(tài)分配對象的生命周期限制在特定的作用域,采用scoped ptr可以有作用域保護,使用起來也優(yōu)于auto ptr。

Third——>shared ptr

shared ptr顧名思義就是共享,所以也就是說多個指針可以指向同一個內(nèi)存,它所采用的是引用計數(shù)的原理,也就是引進了一個計數(shù)器shared_count,用來表示當(dāng)前有多少個智能指針對象共享指針指向的內(nèi)存。因此shared_ptr可以做為STL容器的元素。析構(gòu)函數(shù)中不是直接釋放指針對應(yīng)的內(nèi)塊,shared_count大于1則不釋放內(nèi)存只是將引用計數(shù)減1,只是計數(shù)等于1時釋放內(nèi)存。這樣避免了一塊內(nèi)存被多次析構(gòu)的問題。

代碼實現(xiàn):

template <class T>
class SharedPtr
{
public:
	SharedPtr(T* Ptr)
		:_Ptr(Ptr)
		,_Pcount(new long(1))
	{}

	~SharedPtr()
	{
		_Release();
	}

	SharedPtr(SharedPtr<T>& sp)
		:_Ptr(sp._Ptr)
		,_Pcount(sp._Pcount)
	{
		++(*_Pcount);
	}

	SharedPtr<T>& operator=(SharedPtr<T>& sp)
	{
		if(&sp!=this)
		{
			_Release();
		    _Ptr=sp._Ptr;
		    _Pcount=sp._Pcount;
		    ++(*_Pcount);
		}	
	}

	T& operator*()
	{
		return *_Ptr;
	}

	T* operator->()
	{
		return _Ptr;
	}

	long UseCount()
	{
		return *_Pcount;
	}

	T* GetPtr()
	{
		return _Ptr;
	}

protected:
	T* _Ptr;
	long *_Pcount;
	void _Release()
	{
		if(--(*_Pcount)==0)
			{
				delete _Ptr;
				delete _Pcount;
			}
	}
};

由上述代碼可知,我們在拷貝和賦值也會將引用計數(shù)進行遞增,而實現(xiàn)也只是一般的復(fù)制。

動態(tài)對象的正確釋放是編程中最容易出錯的地方,利用智能指針可以更安全的使用動態(tài)對象,使得我們的程序更高效、安全。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

標(biāo)題名稱:智能指針的簡單剖析和實現(xiàn)-創(chuàng)新互聯(lián)
URL鏈接:http://chinadenli.net/article24/hcoje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、手機網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化、電子商務(wù)、外貿(mào)建站企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站