真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

3種智能指針

  • 出現(xiàn)智能指針的原因

    10年積累的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有上海免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

     用智能指針,把申請內(nèi)存的工作都在接口內(nèi)部實(shí)現(xiàn)并加以限制,把釋放內(nèi)存的工作交給智能指針。
  • 常見的智能指針

     1.你知道智能指針嗎?智能指針的原理。
     2.常用的智能指針。
     3.智能指針的實(shí)現(xiàn)。

1答案:智能指針是一個(gè)類,這個(gè)類的構(gòu)造函數(shù)中傳入一個(gè)普通指針,析構(gòu)函數(shù)中釋放傳入的指針。智能指針的類都是棧上的對象,所以當(dāng)函數(shù)(或程序)結(jié)束時(shí)會自動被釋放,

     2, 最常用的智能指針: 

      1)std::auto_ptr,有很多問題。 不支持復(fù)制(拷貝構(gòu)造函數(shù))和賦值(operator =),但復(fù)制或賦值的時(shí)候不會提示出錯。因?yàn)椴荒鼙粡?fù)制,所以不能被放入容器中。

     2) C++11引入的unique_ptr(scoped_ptr), 也不支持復(fù)制和賦值,但比auto_ptr好,直接賦值會編譯出錯。實(shí)在想賦值的話,需要使用:std::move。

      例如:

          std::unique_ptr p1(new int(5));
          std::unique_ptr p2 = p1; // 編譯會出錯
          std::unique_ptr p3 = std::move(p1); // 轉(zhuǎn)移所有權(quán), 現(xiàn)在那塊內(nèi)存歸p3所有, p1成為無效的指針.

      3) C++11或boost的shared_ptr,基于引用計(jì)數(shù)的智能指針。可隨意賦值,直到內(nèi)存的引用計(jì)數(shù)為0的時(shí)候這個(gè)內(nèi)存會被釋放。

      4)C++11或boost的weak_ptr,弱引用。 引用計(jì)數(shù)有一個(gè)問題就是互相引用形成環(huán),這樣兩個(gè)指針指向的內(nèi)存都無法釋放。需要手動打破循環(huán)引用或使用weak_ptr。顧名思義,weak_ptr是一個(gè)弱引用,只引用,不計(jì)數(shù)。如果一塊內(nèi)存被shared_ptr和weak_ptr同時(shí)引用,當(dāng)所有shared_ptr析構(gòu)了之后,不管還有沒有weak_ptr引用該內(nèi)存,內(nèi)存也會被釋放。所以weak_ptr不保證它指向的內(nèi)存一定是有效的,在使用之前需要檢查weak_ptr是否為空指針。

  • 智能指針的實(shí)現(xiàn)

  • Autoptr

    代碼:

#pragma once

template
class Autoptr
{
public:
	Autoptr()
		:_ptr(NULL)
	{}
	Autoptr(T *ptr)
		:_ptr(ptr)
	{}
	Autoptr(Autoptr& a)
		:_ptr(a._ptr)
	{
		delete _ptr;
		a._ptr = NULL;
	}
	~Autoptr()
	{
		if (_ptr)
		{
			delete _ptr;
			_ptr = NULL;
		}
	}
	Autoptr& operator=(Autoptr&a)
	{
		if (this != &a)
		{
			delete _ptr;
			_ptr = a._ptr;
			a._ptr = NULL;
		}
		return *this;
	}
	T& operator*()
	{
		return *_ptr;
	}
	T* Getptr()
	{
		return _ptr;
	}

protected:
	T *_ptr;
};
void Autoptrtest()
{
	int *a = new int(5);
	Autoptr ap1(a);
	cout << *ap1 << endl;
	cout << ap1.Getptr() << endl;
	Autoptr ap2(ap1);
	cout << *ap2 << endl;
	cout << ap2.Getptr() << endl;
	cout << ap1.Getptr() << endl;
	Autoptr ap3;
	ap3 = ap2;
	cout << *ap3 << endl;
	cout << ap3.Getptr() << endl;
	cout << ap2.Getptr() << endl;
}
  • Scopedptr

   代碼:

#pragma once
template
class Scopedptr
{
public:
	Scopedptr()
		:_ptr(NULL)
	{}
	Scopedptr(T *data)
		:_ptr(data)
	{}
	~Scopedptr()
	{
		if (_ptr)
		{
			delete _ptr;
			_ptr = NULL;
		}
	}
	T& operator*()
	{
		return *_ptr;
	}
	T* Getptr()
	{
		return _ptr;
	}
protected://加上protected可以防止使用者在類之外定義拷貝構(gòu)造和運(yùn)算符的重載函數(shù) 
	Scopedptr(const Scopedptr&sp); //不讓使用者使用拷貝,可以防止拷貝,所以只聲明不定義
	Scopedptr& operator=(const Scopedptr&sp);
private:
	T *_ptr;
};
void Scopedptrtest()
{
	int *a = new int(5);
	Scopedptr ap1(a);
	cout << *ap1 << endl;
	cout << ap1.Getptr() << endl;
	/*Scopedptr ap2(ap1);
	cout << *ap2 << endl;
	Scopedptr ap3;
	ap3 = ap2;
	cout << *ap3 << endl;
	cout << ap3.Getptr() << endl;
	cout << ap2.Getptr() << endl;*/
}
  • Sharedptr

    代碼:

#pragma once
template
class Sharedptr
{
public:
	Sharedptr()
		:_ptr(NULL)
		, _pcount(new int(1))
	{}
	Sharedptr(T *ptr)
		:_ptr(ptr)
		, _pcount(new int(1))
	{}
	Sharedptr(const Sharedptr& sp)
		:_ptr(sp._ptr)
		, _pcount(sp._pcount)
	{
		++(*_pcount);
	}
	~Sharedptr()
	{
		if (_ptr)
		{
			if (--(*_pcount)==0)
			{
				delete _ptr;
				delete _pcount;
				_ptr = NULL;
				_pcount = NULL;
			}
			_ptr = NULL;
		}
	}
	Sharedptr& operator=(const Sharedptr &sp)
	{
		if (this != &sp)
		{
			if (--(*_pcount) == 0)
			{
				delete _ptr;
				delete _pcount;
				_ptr = NULL;
				_pcount = NULL;
			}
			_ptr = sp._ptr;
			_pcount = sp._pcount;
			++(*_pcount);
		}
		return *this;
	}
private:
	T* _ptr;
	int *_pcount;
};
void Sharedptrtest()
{
	int *a = new int(5);
	Sharedptr ap1(a);
	Sharedptr ap2(ap1);
	Sharedptr ap3;
	ap3 = ap2;
}

當(dāng)前標(biāo)題:3種智能指針
鏈接分享:http://weahome.cn/article/igpcej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部