91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

boost::shared_ptr與定制刪除器

發布時間:2020-07-01 22:35:45 來源:網絡 閱讀:724 作者:Sekai_Z 欄目:編程語言

boost::shared_ptr與定制刪除器shared_ptr

     shared_ptr是一種智能指針,他的作用如同指針,但會記錄有多少shared_ptr指向同一個對象。使用時必須引用頭文件<boost/shared_ptr.hpp>

template<class T>
class ShartedPtr
{
public:
	//構造函數
	ShartedPtr(T* ptr)
	:_ptr(ptr)
	, _pCount(new int(1))
	{
	}
	//拷貝構造
	ShartedPtr(const ShartedPtr<T>&sp)
		:_ptr(sp._ptr)
		, _pCount(sp._pCount)
	{
		++(*_pCount);
	}
	//賦值
	ShartedPtr&operator = (ShartedPtr<T>sp)
	{
		swap(_ptr, sp._ptr);
		swap(_pCount, sp._pCount);

		return *this;
	}
	//重載*
	T &operator*()
	{
		return *_ptr;
	}
	//重載->
	T *operator->()
	{
		return _ptr;
	}
	//析構函數
	~ShartedPtr()
	{
		Relase();
	}
protected:
	void Relase()
	{
		if (--(*_pCount) == 0)
		{
			delete _ptr;
			delete _pCount;
		}
	}
private:
	T* _ptr;
	int *_pCount;
};
struct A
{
	int _A;
};
int main()
{
	ShartedPtr<int> sp1(new int(1));
	ShartedPtr<int> sp2(sp1);
	sp1 = sp2;
	ShartedPtr<int> sp3(sp2);
	*sp3 = 10;
	ShartedPtr<A>sp4(new A);
	sp4->_A = 30;
	return 0;
}

 boost::shared_ptr與定制刪除器但是shared_ptr也存在一系列問題

  1. 引用計數存在線程安全問題

  2. 會出現循環引用問題

  3. 定制刪除器

       循環引用即在使用雙向鏈表時,若使用shared_ptr則會出現在析構時由于同一塊空間有兩個對象指向,且對象兩兩之間相互指向,故在析構時兩對象都在等對方的_pCount減為一,從而一直到最后對象都沒有析構

shared_ptr<Node>cur(new Node(1));
shared_ptr<Node>next(new Node(1));
cur->_next=next;
next->_prev=cur;

shared_ptr的定制刪除器

template<class T,class D>
class ShartedPtr
{
public:
	//構造函數
	ShartedPtr(T* ptr)
	:_ptr(ptr)
	, _pCount(new int(1))
	{
	}
	//構造函數的一個重載
	ShartedPtr(T* ptr,D del)
		:_ptr(ptr)
		, _pCount(new int(1))
		, _del(del)
	{
	}
	//拷貝構造
	ShartedPtr(const ShartedPtr<T,D>&sp)
		:_ptr(sp._ptr)
		, _pCount(sp._pCount)
	{
		++(*_pCount);
	}
	//賦值
	ShartedPtr&operator = (ShartedPtr<T,D>sp)
	{
		swap(_ptr, sp._ptr);
		swap(_pCount, sp._pCount);

		return *this;
	}
	//重載*
	T &operator*()
	{
		return *_ptr;
	}
	//重載->
	T *operator->()
	{
		return _ptr;
	}
	//析構函數
	~ShartedPtr()
	{
		Release();
	}
protected:
	void Release()
	{
		if (--(*_pCount) == 0)
		{
			_del( _ptr);
			delete _pCount;
		}
	}
private:
	T* _ptr;
	int *_pCount;
	D _del;
};
struct DefaultDel
{
	void operator()(void* ptr)
	{
		delete ptr;
	}
};
struct Free
{
	void operator()(void* ptr)
	{
		free(ptr);
	}
};
//struct Fclose
//{
//	void operator()(void* ptr)
//	{
//		fclose(FILE*(ptr));
//	}
//};
int main()
{
	ShartedPtr<int, DefaultDel>sp1(new int(1));
	ShartedPtr<int, Free>sp2((int*)malloc(sizeof(int)));

}

   ps:仿函數的介紹

    仿函數就是使一個類使用看上去像一個函數,其實現就是類中實現一個operator().這個類就有了類似函數的行為。

struct Free
{
                 void operator()(void *ptr)
                {
                                free( ptr);
                }
};
void Testsharedptr()
{
int *p1=(int*)malloc(sizeof(int)*10);
shared_ptr<int>sp1(p1,Free());//在使用完后自動釋放p1
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

华阴市| 农安县| 城步| 大余县| 澄城县| 离岛区| 句容市| 大悟县| 固始县| 蓝山县| 嫩江县| 阜新市| 盈江县| 广昌县| 台北市| 台山市| 盐山县| 贵定县| 克什克腾旗| 岢岚县| 湛江市| 贵德县| 丹棱县| 刚察县| 郸城县| 钦州市| 甘孜| 靖宇县| 望城县| 黔西| 东光县| 镇赉县| 洪泽县| 肥东县| 惠东县| 日照市| 文昌市| 阳朔县| 尤溪县| 土默特左旗| 佛教|