国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

淺析C++智能指針和enable_shared_from_this 機(jī)制

共 10161字,需瀏覽 21分鐘

 ·

2020-12-27 23:45

大家好,我是小牛,今天跟聊一下 BAT 面試 C++ 開發(fā)工程師必問的一個(gè)考點(diǎn):智能指針。

小艾:你昨晚面 C++ 去了?

小牛:對(duì)啊,不是這個(gè)廠主要技術(shù)棧都是 C++ 嘛,我就面去了。

小艾:?jiǎn)柫它c(diǎn)啥???

小牛:BAT 這 C++ 問的都差不多,又問智能指針了。

小艾:那來講講唄。

小牛:來。

智能指針的引入

大家都知道,指針是 C++ 中非常重要的一部分,大家在初期學(xué)習(xí) C++ 的時(shí)候一定學(xué)過類似這樣的指針方式。

int??*ptr;

這種指針也被稱為裸指針。但是使用裸指針會(huì)存在一些不足

  1. 如果使用裸指針分配內(nèi)存后,忘記手動(dòng)釋放資源,會(huì)出現(xiàn)內(nèi)存泄漏。

  2. 如果使用多個(gè)裸指針指向同一資源,其中一個(gè)指針對(duì)資源進(jìn)行釋放,其它指針成為空懸指針,如果再次釋放會(huì)存在不可預(yù)測(cè)的錯(cuò)誤。上圖中當(dāng) sp1 把資源釋放后,sp2 成了空懸指針。空懸指針指的是指針?biāo)赶虻膶?duì)象已經(jīng)釋放的時(shí)候自身卻沒有被置為 nullptr。sp1 通過 free/delete 釋放資源的內(nèi)存時(shí),內(nèi)存不會(huì)立刻被系統(tǒng)回收,而是狀態(tài)改變?yōu)榭杀黄渌胤缴暾?qǐng)的狀態(tài)。這時(shí)當(dāng)再次操作 sp2,這塊內(nèi)存可能被其它地方申請(qǐng)了,而具體被誰申請(qǐng)了是不確定的,因此可能導(dǎo)致的錯(cuò)誤也是不可預(yù)測(cè)的。

  3. 如果程序異常退出時(shí),裸指針的釋放資源的代碼未能執(zhí)行,也會(huì)造成內(nèi)存泄漏。

為了改善裸指針的不足,確保資源的分配和釋放是配對(duì)的,開發(fā)者提出了智能指針。智能指針主要是對(duì)裸指針進(jìn)行了一次面向?qū)ο蟮姆庋b,在構(gòu)造函數(shù)中初始化資源地址,在析構(gòu)函數(shù)中釋放資源。 當(dāng)資源應(yīng)該被釋放時(shí),指向它的智能指針可以確保自動(dòng)地釋放它。

C++ 庫中,為智能指針提供了不帶引用計(jì)數(shù)和帶引用計(jì)數(shù)的兩種方案。

引用計(jì)數(shù)用于表示有多少智能指針引用同一資源。不帶引用計(jì)數(shù)的智能指針采用獨(dú)占資源的方式,而帶引用計(jì)數(shù)的智能指針則可以同時(shí)多個(gè)指向同一資源。下面介紹一下它們的主要特點(diǎn)區(qū)別。

智能指針的分類

不帶引用計(jì)數(shù)的智能指針

不帶引用計(jì)數(shù)的智能指針包括 auto_ptr、scoped_ptrunique_ptr 三種指針。

不帶引用計(jì)數(shù)的智能指針

1. auto_ptr:

我們先來看個(gè)例子:

#include
int?main()
{
?auto_ptr<int>??ptr(new?int(6));//定義auto_ptr指針ptr
?auto_ptr<int>??ptr1(ptr);??//拷貝構(gòu)造ptr定義ptr1
?*ptr=8;//對(duì)空指針ptr賦值會(huì)產(chǎn)生不可預(yù)料的錯(cuò)誤
?return?0;
}

開始時(shí) ptr 指向資源,一個(gè)整型數(shù)字6,當(dāng)用 ptr1 拷貝構(gòu)造 ptr 時(shí),ptr1 指向資源,而 ptr 則指向 nullptr。下一行程序中如果對(duì)空指針 ptr 賦值 8,將會(huì)產(chǎn)生不可預(yù)料的錯(cuò)誤。

下圖表示 auto_ptr 指針對(duì)資源的指向過程。

auto_ptr

使用拷貝構(gòu)造時(shí),如果只有最后一個(gè) auto_ptr 持有資源,其余 auto_ptr 持有的資源會(huì)被置為 nullptr。

因此需要注意,不能在容器中使用 auto_ptr,當(dāng)容器發(fā)生拷貝時(shí),原容器中 auto_ptr 持有的資源會(huì)置 nullptr。

下面我們?cè)賮砜匆幌?auto_ptr 的部分源碼和部分解析:

template<class?_Ty>
class?auto_ptr
{
?
public:
?typedef?_Ty?element_type;

?explicit?auto_ptr(_Ty?*?_Ptr=nullptr)?noexcept
?????:?_Myptr(_Ptr)//初始化列表
?????
{?//構(gòu)造函數(shù)
?????}

?auto_ptr(auto_ptr&?_Right)?noexcept
??:?_Myptr(_Right.release())
??{?//拷貝構(gòu)造函數(shù),會(huì)調(diào)用release()函數(shù)
??}
??
?_Ty?*?release()?noexcept
??
{
????????????/*使用拷貝構(gòu)造時(shí),最后一個(gè)auto_ptr持有資源,
???其余被置為nullptr*/
?
??_Ty?*?_Tmp?=?_Myptr;
??_Myptr?=?nullptr;
??return?(_Tmp);
??}
private:
?_Ty?*?_Myptr;//指向資源?
};

當(dāng)試圖調(diào)用 auto_ptr 的拷貝構(gòu)造函數(shù)時(shí),在初始化列表中調(diào)用了 release() 函數(shù),release() 函數(shù)用一個(gè) _Tmp 指針保存資源并返回用于初始化當(dāng)前的 auto_ptr 的類成員 _Myptr,而 _Right 對(duì)應(yīng)的 _Myptr 被置為 nullptr。

2. scoped_ptr

scoped_ptrauto_ptr 有些不同,它私有化了拷貝構(gòu)造函數(shù)和賦值函數(shù),資源的所有權(quán)無法進(jìn)行轉(zhuǎn)移,也無法在容器中使用。

下面使用一段代碼表現(xiàn) scoped_ptr 的特性,如果不規(guī)范使用會(huì)發(fā)生錯(cuò)誤。

正確用法:

scoped_ptr<int>?sp1(new?int(6));//初始化sp1指針

錯(cuò)誤用法:

scoped_ptr<int>?sp2(sp1);//錯(cuò)誤,無法拷貝構(gòu)造

這種方法是錯(cuò)誤的,因?yàn)閟coped_ptr私有化了拷貝構(gòu)造函數(shù),無法顯式調(diào)用。

?scoped_ptr<int>?sp3(new?int(5))//初始化sp2指針
?sp1
=sp3;//錯(cuò)誤,無法賦值

這種方法是錯(cuò)誤的,因?yàn)閟coped_ptr私有化了賦值構(gòu)造函數(shù),無法顯式調(diào)用。

有時(shí)候面試官會(huì)問到,scoped_ptr 是如何保證資源的所有權(quán)的?

這時(shí)候就可以按照上面的講解來回答:

scoped_ptr 私有化了拷貝構(gòu)造函數(shù)和賦值函數(shù),資源的所有權(quán)無法進(jìn)行轉(zhuǎn)移,所以保證了資源的所有權(quán)。

然后再來看一下 scoped_ptr 的部分源碼和部分解析:

template<class?T>?
class?scoped_ptr
{

private:
????T?*?px;?
????scoped_ptr(scoped_ptr?const?&);//拷貝構(gòu)造函數(shù)
????scoped_ptr?&?operator=(scoped_ptr?const?&);//賦值構(gòu)造函數(shù)
?
public:
????typedef?T?element_type;
????explicit?scoped_ptr(?T?*?p?=?nullptr?):?px(?p?)
????
{
????}
????~scoped_ptr()?//析構(gòu)函數(shù)
};

scoped_ptr 通過私有化拷貝構(gòu)造函數(shù)和賦值構(gòu)造函數(shù)來拒絕淺拷貝的發(fā)生。

值得注意的是,auto_ptr 是通過將除最后一個(gè)以外的其它 auto_ptrnullptr 來避免淺拷貝的發(fā)生,它的資源所有權(quán)是可以轉(zhuǎn)移的。

scoped_ptr 是直接禁止了拷貝與賦值,資源所有權(quán)無法轉(zhuǎn)移。

3. unique_ptr

unique_ptr 刪除了拷貝構(gòu)造函數(shù)和賦值函數(shù),因此不支持普通的拷貝或賦值操作。如下所示:

unique_ptr<int>?p1(new?int(6));//正確寫法
unique_ptr<int>?p2(p1);?//這么寫是錯(cuò)誤的:
//?unique_ptr不支持拷貝
unique_ptr<int>?p3;
p3=p2;//這么寫是錯(cuò)誤的:unique_ptr不支持賦值

再來看一下 unique_ptr 的部分源碼和部分解析:

template<class?_Ty,class?_Dx>
class?unique_ptr:
?public?_Unique_ptr_base<_Ty,?_Dx>
{?
public:
?typedef?_Unique_ptr_base<_Ty,?_Dx>?_Mybase;
?typedef?typename?_Mybase::pointer?pointer;
?typedef?_Ty?element_type;
?typedef?_Dx?deleter_type;

?unique_ptr(unique_ptr&&?_Right)?noexcept
??:?_Mybase(_Right.release(),
???_STD?forward<_Dx>(_Right.get_deleter()))
??{?//?右值引用的拷貝構(gòu)造函數(shù)
??}

?unique_ptr&?operator=(unique_ptr&&?_Right)?noexcept
??{?//提供了右值引用的operator=賦值構(gòu)造函數(shù)
??if?(this?!=?_STD?addressof(_Right))
???{?
???reset(_Right.release());
???this->get_deleter()?=?_STD?forward<_Dx>
???(_Right.get_deleter());
???}
??return?(*this);
??}
?/*
?刪除了unique_ptr的拷貝構(gòu)造和賦值函數(shù),拒絕淺拷貝
?*/

?unique_ptr(const?unique_ptr&)?=?delete;
?unique_ptr&?operator=(const?unique_ptr&)?=?delete;
?};

unique_ptrscoped_ptr一樣禁止了拷貝構(gòu)造和賦值構(gòu)造,引入了帶右值引用的拷貝構(gòu)造和賦值??梢园?unique_ptr 作為函數(shù)的返回值。

不帶引用計(jì)數(shù)的智能指針總結(jié):

相同點(diǎn):最終只有一個(gè)智能指針持有資源。

不同點(diǎn):

  1. auto_ptr 進(jìn)行拷貝構(gòu)造時(shí),會(huì)對(duì)之前的auto_ptr的資源置nullptr操作;
  2. scoped_ptr 通過私有化了拷貝構(gòu)造和賦值函數(shù)杜絕淺拷貝;
  3. unique_ptr 通過刪除了拷貝構(gòu)造和賦值函數(shù)函數(shù)杜絕淺拷貝,但引入了帶右值引用的拷貝構(gòu)造和賦值函數(shù)。

帶引用計(jì)數(shù)的智能指針

當(dāng)需要多個(gè)智能指針指向同一個(gè)資源時(shí),使用帶引用計(jì)數(shù)的智能指針。

每增加一個(gè)智能指針指向同一資源,資源引用計(jì)數(shù)加一,反之減一。當(dāng)引用計(jì)數(shù)為零時(shí),由最后一個(gè)指向資源的智能指針將資源進(jìn)行釋放。

下圖表示帶引用計(jì)數(shù)智能指針的工作過程。sp1 對(duì)象和 sp2 對(duì)象通過指針指向同一資源,引用計(jì)數(shù)器記錄了引用資源的對(duì)象個(gè)數(shù)。

智能指針的工作過程

當(dāng) sp1 對(duì)象發(fā)生析構(gòu)時(shí),引用計(jì)數(shù)器的值減 1,由于引用計(jì)數(shù)不等于 0,資源并未釋放,如下圖所示:

sp1 對(duì)象發(fā)生析構(gòu)

當(dāng) sp2 對(duì)象也發(fā)生析構(gòu),引用計(jì)數(shù)減為 0,資源釋放,如下圖所示:

sp2 對(duì)象也發(fā)生析構(gòu)

即引用計(jì)數(shù)可以保證多個(gè)智能指針指向資源時(shí)資源在所有智能對(duì)其取消引用再釋放,避免過早釋放產(chǎn)生空懸指針。帶引用計(jì)數(shù)的智能指針包括 shared_ptrweak_ptr

資源釋放

1. shared_ptr

shared_ptr 一般稱為強(qiáng)智能指針,一個(gè) shared_ptr 對(duì)資源進(jìn)行引用時(shí),資源的引用計(jì)數(shù)會(huì)增加一,通常用于管理對(duì)象的生命周期。只要有一個(gè)指向?qū)ο蟮?shared_ptr 存在,該對(duì)象就不會(huì)析構(gòu)。

上圖中引用計(jì)數(shù)的工作過程就使用了 shared_ptr。

2. weak_ptr

weak_ptr 一般被稱為弱智能指針,其對(duì)資源的引用不會(huì)引起資源的引用計(jì)數(shù)的變化,通常作為觀察者,用于判斷資源是否存在,并根據(jù)不同情況做出相應(yīng)的操作。

比如使用 weak_ptr 對(duì)資源進(jìn)行弱引用,當(dāng)調(diào)用 weak_ptrlock() 方法時(shí),若返回 nullptr,則說明資源已經(jīng)不存在,放棄對(duì)資源繼續(xù)操作。否則,將返回一個(gè) shared_ptr 對(duì)象,可以繼續(xù)操作資源。

另外,一旦最后一個(gè)指向?qū)ο蟮?shared_ptr 被銷毀,對(duì)象就會(huì)被釋放。即使有 weak_ptr 指向?qū)ο?,?duì)象也還是會(huì)被釋放。


小艾問:既然它這引用都不算數(shù),那它有什么用呢?

小牛答:別急,我們來慢慢講。


enable_shared_from_this 機(jī)制

小牛:考慮下面這樣一個(gè)場(chǎng)景:

在多線程環(huán)境中,假設(shè)有一個(gè)對(duì)象池類 ObjectPool 和一個(gè)對(duì)象類 Object。ObjectPool 類主要實(shí)現(xiàn)通過不同的 key 返回對(duì)應(yīng) Object 對(duì)象。

要求同一程序中由 Object 類實(shí)例出的不同對(duì)象只有一個(gè),即當(dāng)多處用到同一個(gè)對(duì)象,Object 對(duì)象應(yīng)該被共享。同時(shí)當(dāng)對(duì)象不再需要時(shí)應(yīng)該被析構(gòu),并刪除對(duì)應(yīng)的 key。

多線程應(yīng)用場(chǎng)景

小艾說:這還不簡(jiǎn)單,看我的。代碼刷的一下就寫完了。

//場(chǎng)景代碼
#include
class?ObjectPool:boost::noncopyable
{
public:
?shared_ptr?get(const?string&?key)
?{
?shared_ptr?shObject;
????MutexLockGuard?lock(mutex);
?weak_ptr&?wkObject=object[key];
?shObject=wkObject.lock();
?//對(duì)象存在,提升成功并返回
?if(!shObject){
??/*對(duì)象不存在,提升失敗,shOject重新
??指向新創(chuàng)建的Object對(duì)象,
??并綁定回調(diào)函數(shù),讓對(duì)象Oject需要析構(gòu)時(shí)
??調(diào)用OjectPool對(duì)象的成員函數(shù)*/

???????shObject.reset(new?Object(key),
????????????????????boost::bind(&
????????ObjectPool::deleteObject,this,
????????_1));
???????wkObject=shObject;
?}
?return?shObject;
?}
?private:
?void?deleteObject(Object*?obj)
?
{???/*回調(diào)函數(shù),在對(duì)象需要析構(gòu)時(shí)調(diào)用,從map中
?刪除對(duì)象和對(duì)應(yīng)的key*/

??if(obj){
???MutexLockGuard?lock(mutex);
???object.erase(obj->key());
??}
??delete?obj;
?}
?mutable?MutexLock?mutex;
?std::map<string,weak_ptr>?object;
?/*map中不能使用shared_ptr,這會(huì)導(dǎo)致Oject對(duì)象永遠(yuǎn)不會(huì)被銷
?毀*/

};

小牛說:你這有問題啊?

小艾答:有什么問題?為了實(shí)現(xiàn) Object 類析構(gòu)時(shí)調(diào)用 ObjectPool 的回調(diào)函數(shù),代碼中把 ObjectPool 的 this 指針保存在了 boost::function 處。

小牛說:那線程安全問題就來了。如果 ObjectPool 先于 Object 對(duì)象析構(gòu),就會(huì)發(fā)生 core dump。因?yàn)?ObjectPool 對(duì)象已經(jīng)不存在了,也就沒有辦法調(diào)用其成員方法。

小艾問:那怎么解決呢?

小牛說:簡(jiǎn)單啊,只需將 this 指針替換成指向當(dāng)前對(duì)象的 shared_ptr,從而保證在 Object 對(duì)象需要調(diào)用 ObjectPool::deleteObject 時(shí) ObjectPool 還活著。你要不試試實(shí)現(xiàn)一下?

小艾說:那我寫一個(gè)吧。

shared_ptr?getSharedPtr()?
{?
???return?shared_ptr
(this);?
}

小牛答:?jiǎn)栴}來了,在多線程環(huán)境中,在需要返回 this 對(duì)象時(shí)是無法得知對(duì)象的生存情況的。因此不能直接返回 this 對(duì)象

給你普及個(gè)解決方法吧,你可以通過繼承 enable_shared_from_this 模板對(duì)象,然后調(diào)用從基類繼承而來的 shared_from_this 方法來安全返回指向同一資源對(duì)象的 shared_ptr。

小艾:為什么繼承 enable_shared_from_this 模板對(duì)象就可以安全返回?

小牛:在回答你的問題前,我們先來講講 shared_ptr構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)對(duì)資源和引用計(jì)數(shù)影響的區(qū)別。

下面從 shared_ptr實(shí)現(xiàn)原理來看:

shared_ptr_Ptr_base 繼承了 element_type_Ref_count_base 類型的兩個(gè)成員變量。

template<class?_Ty>
class?_Ptr_base
{
?
private:
?element_type?*?_Ptr{nullptr};?//?指向資源的指針
?_Ref_count_base?*?_Rep{nullptr};?//?指向資源引用計(jì)數(shù)的指針
};

_Ref_count_base 中定義了原子類型的變量 _Uses_Weaks,它們分別記錄資源的引用個(gè)數(shù)和資源觀察者的個(gè)數(shù)。

class?__declspec(novtable)?_Ref_count_base
{
?
private:
?_Atomic_counter_t?_Uses;//記錄資源引用個(gè)數(shù)
?_Atomic_counter_t?_Weaks;//記錄觀察者個(gè)數(shù)
}

當(dāng)要使用 shared_ptr 管理同一資源,調(diào)用 shared_ptr 的構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)是不一樣的,它們雖然使得不同 shared_ptr 指向同一資源,但管理引用計(jì)數(shù)資源的方式卻不一樣。

下面給出兩個(gè) shared_ptr 管理同一資源(A對(duì)象)使用不同構(gòu)造函數(shù)對(duì)引用計(jì)數(shù)對(duì)象的影響。

方式1:調(diào)用構(gòu)造函數(shù)

class?A
{

??public:
??A(){}
??~A(){}
};
A?*p?=?new?A();?
shared_ptr
?ptr1(p);//調(diào)用構(gòu)造函數(shù)
shared_ptr
?ptr2(p);//調(diào)用構(gòu)造函數(shù)
方式1:調(diào)用構(gòu)造函數(shù)

如上圖所示,方式1中 ptr1 和 ptr2 都調(diào)用了 shared_ptr 的構(gòu)造函數(shù),該構(gòu)造方式使得 ptr1ptr2 都開辟了自已的引用資源對(duì)象 _Ref_count_base,即 _Ref_count_base 有兩個(gè),都記錄了 A 對(duì)象的引用計(jì)數(shù)為 1,析構(gòu)時(shí) ptr1ptr2 的引用計(jì)數(shù)各自減為 1,導(dǎo)致 A 對(duì)象析構(gòu)兩次,出現(xiàn)邏輯錯(cuò)誤。

方式2:調(diào)用拷貝構(gòu)造函數(shù)

class?A
{

public:
???A(){}
???~A(){}
}
A?*p?=?new?A();?
shared_ptr
?ptr1(p);//調(diào)用構(gòu)造函數(shù)
shared_ptr
?ptr2(ptr1);//調(diào)用拷貝構(gòu)造函數(shù)
方式2:調(diào)用拷貝構(gòu)造函數(shù)

如上圖所示,方式2中由于 ptr2 拷貝構(gòu)造 ptr1,它們引用的 _Ref_count_base 是同一個(gè),因此引用計(jì)數(shù)為 2,析構(gòu)的時(shí)候 A 對(duì)象只析構(gòu)一次,正常運(yùn)行。

在明白了 shared_ptr 構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)的做的事情不同后,就能理解當(dāng)需要返回一個(gè)需要 shared_ptr 管理的對(duì)象為什么不能寫成 return shared_ptr< A >(this) 了。

小艾:說的沒錯(cuò),因?yàn)檫@樣會(huì)調(diào)用 shared_ptr 的構(gòu)造函數(shù),對(duì)于 this 對(duì)象再創(chuàng)建一個(gè)新的引用計(jì)數(shù)對(duì)象,從而導(dǎo)致對(duì)象多次析構(gòu)而出現(xiàn)邏輯錯(cuò)誤。

小牛:再給你深入講講 enable_shared_from_this 的實(shí)現(xiàn)機(jī)制。

如下所示,enable_shared_from_this 類中包含一個(gè)作為觀察者的成員變量。

template<class?_Ty>
class?enable_shared_from_this
{
?
public:
???mutable?weak_ptr<_Ty>?_Wptr;//指向資源
};

當(dāng)一個(gè)類繼承了 enable_shared_from_this 類,就繼承了 _Wptr 這個(gè)成員變量。

當(dāng)使用 shared_ptr< A >(new A()) 第一次構(gòu)造智能指針對(duì)象時(shí),就會(huì)初始化一個(gè)作為觀察者的弱智能指針 _Wptr 指向A對(duì)象資源。

再通過 shared_from_this() 方法代替 shared_ptr 的普通構(gòu)造函數(shù)來返回一個(gè) shared_ptr 對(duì)象,從而避免產(chǎn)生額外的引用計(jì)數(shù)對(duì)象。

shared_ptr?getSharedPtr()?
{?
???return?shared_from_this();?
}

shared_from_this 函數(shù)中,主要嘗試將弱智能指針提升為強(qiáng)智能指針來返回一個(gè) shared_ptr 對(duì)象。

這樣還能在多線程環(huán)境中判斷對(duì)象是否存活,存活即提升成功,安全返回。如果對(duì)象已經(jīng)析構(gòu),則放棄提升,即起到了保證線程安全的作用。

小牛:了解了enable_shared_from_this,要不再試試改代碼?

小艾:那我來改一下之前的代碼。

第一處修改:

class?ObjectPool:boost::noncopyable
//為
class?ObjectPool:public?boost::enable_shared_from_this
????????????????boost::noncopyable
{/*...*/};

第二處修改:

//改變
shared_ptr?get(const?string&?key)
{
??/*...*/
??shObject.reset(new?Object(key),
?????????????????????boost::bind(&ObjectPool::deleteObject,this,_1));
??/*...*/???
}
//為
shared_ptr?get(const?string&?key)
{
??/*...*/
??shObject.reset(new?Object(key),
?????????????????????boost::bind(&ObjectPool::deleteObject,shared_from_this(),_1));
??/*...*/???
}

完整代碼:

#include
class?ObjectPool:public?boost::enable_shared_from_this,
????????????????boost::noncopyable
{
public:
shared_ptr?get(const?string&?key)
{
???shared_ptr?shObject;
???MutexLockGuard?lock(mutex);
???weak_ptr&?wkObject=object[key];
???shObject=wkObject.lock();//對(duì)象存在,提升成功并返回
???if(!shObject){
????/*對(duì)象不存在,提升失敗,shOject重新指向新創(chuàng)建的
????Object對(duì)象,并綁定回調(diào)函數(shù),讓對(duì)象Oject需要析構(gòu)時(shí)
????調(diào)用OjectPool對(duì)象的成員函數(shù)*/

??????shObject.reset(new?Object(key),
??????????????????????boost::bind(&
??????????ObjectPool::deleteObject,shared_from_this(),
??????????_1));
??????wkObject=shObject;
???}
???return?shObject;
}
private:
void?deleteObject(Object*?obj)
{???/*回調(diào)函數(shù),在對(duì)象需要析構(gòu)時(shí)調(diào)用,從map中刪除對(duì)象和對(duì)
應(yīng)的key*/

????if(obj){
?????MutexLockGuard?lock(mutex);
?????object.erase(obj->key());
????}
????delete?obj;
}
mutable?MutexLock?mutex;
std::map<string,weak_ptr>?object;
/*map中不能使用shared_ptr,這會(huì)導(dǎo)致Oject對(duì)象永遠(yuǎn)不會(huì)被銷
毀*/

};

小牛:不錯(cuò)不錯(cuò),這下懂了 shared_ptrweak_ptr 結(jié)合的用法了吧。

帶引用計(jì)數(shù)智能指針總結(jié):

  1. shared_ptr 會(huì)增加資源的引用計(jì)數(shù),常用于管理對(duì)象的生命周期。
  2. weak_ptr 不會(huì)增加資源的引用計(jì)數(shù),常作為觀察者用來判斷對(duì)象是否存活。
  3. 使用 shared_ptr 的普通拷貝構(gòu)造函數(shù)會(huì)產(chǎn)生額外的引用計(jì)數(shù)對(duì)象,可能導(dǎo)致對(duì)象多次析構(gòu)。使用 shared_ptr 的拷貝構(gòu)造函數(shù)則只影響同一資源的同一引用計(jì)數(shù)的增減。
  4. 當(dāng)需要返回指向當(dāng)前對(duì)象的 shared_ptr 時(shí),優(yōu)先使用 enable_shared_from_this 機(jī)制。

總結(jié)

今天我們了解了面試中常常會(huì)問到的C++ 智能指針的相關(guān)知識(shí)點(diǎn),結(jié)合源碼和示例理清各種智能指針的特點(diǎn)。

并且結(jié)合一個(gè)實(shí)際的多線程應(yīng)用場(chǎng)景,講解了enable_shared_from_this 機(jī)制,希望能對(duì)大家的學(xué)習(xí)有所幫助。

總結(jié)

參考

  1. https://blog.csdn.net/qiangweiyuan/article/details/88562935
  2. 《Linux多線程服務(wù)端編程使用muduo C++ 網(wǎng)絡(luò)庫》
  3. 《C++ Primer》
  4. 《More Effective C++》
瀏覽 39
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩久操| 色综合一区二区| 影音先锋成人在线资源| 亚洲国产一| 免费福利在线视频| 亚洲秘AV无码一区二区qq群| 亚洲综合日韩在线| jjzz亚洲| 无码a片| av午夜激情| 亚洲一级黄色大片| 精品免费一区二区三区四区| 免费AV网站在线| 丝袜足交视频在线观看| 国产日本欧美韩国久久久久| 欧美日韩中文字幕无码| JUY-579被丈夫的上司侵犯后的第7天,我| 日本爱爱视频免费| 亚洲秘一区二区三区-精品亚洲二区-| 国产36页| 操逼网五月天| 亚洲阿v天堂| 久久私拍视频| 怕怕怕视频| 天天玩夜夜玩天天玩国产99| 日韩理论片| 欧美熟女18| 亚洲性爱中文字幕| 国内老熟妇对白HDXXXX| 自拍视频在线观看| 国产免费一级片| 欧美A色| 一级黄色片网站| 少妇人妻在线| 国产精品2| 久久香蕉电影| 国产精品久久久久的角色| 久久日av| 成人小视频十八禁免费观看 | 伊人性视频| www.在线播放| 中文字幕淫乱视频欧美| 在线观看av网站中文字幕| 亚洲成人av| 国产乱子伦-区二区三区| 日日操视频| A片在线视频| 蜜桃BBwBBWBBwBBw| 超碰99热| 精品人妻一区二区蜜桃视频| 秋霞中文字幕| 在线看片你懂的| 国产乱人| aaa免费视频| 久久久久久久久久久成人| 激情五月婷婷丁香| 蜜桃av秘无码一区三| 免费啪啪网| 久久精品在线播放| 欧美精产国品一二三区别| 亚洲一卡二卡三卡四卡免| 偷拍无码| 久久无码专区| 欧美日韩国产成人电影| 国产成人777777精品综合| 成人三级片网| 国产一级片内射| 欧美黄色免费在线观看| 蜜臀av网| 波多野59部无码喷潮| www.污污污| 中文字幕巨肉乱码中文乱码| 91一二区| 成人免费网站在线| 亚洲视频无码在线| 久久精品国产亚洲AV成人婷婷| 日韩久久高清| 精产国品一区二区三区| 亚洲视频,中文字幕| 安徽妇搡BBBB搡BBBB按摩| 午夜探花在线观看| 国产一区二区免费| 日韩中文在线播放| 黄色一级免费电影| 黄色直播在线观看| 91探花视频在线观看| 影音先锋国产精品| 国精品伦一区一区三区有限公司| 成人伊人大香蕉| 中日韩一级片| 无码网| 国内操逼视频| jizz亚洲| 久久电影五月天| 美女视频黄a视频全免费不卡| 少妇456| 亚洲国产成人精品午夜| 无码做爰欢H肉动漫网站在线看 | 国产内射在线观看| www.色婷婷| 人人操超碰| 久久久久久久| 欧美欧美欧美| 日韩中文久久| 日本天堂网在线观看| 人人色人人黄| 成年人黄色在线观看| 免费在线观看无码| 日韩AV一区二区三区四区| 日本久久视频| 国产嫩草精品A88AV| 国产乱妇乱子伦视频免费观看让女人 | 色五月婷婷AV| 操一线天逼| 免费69视频| 精品久久免费一区二区三区| 欧美高潮| 日韩无码中文字幕视频| 麻豆AV无码| 高清无码波多野结衣| 北京熟妇槡BBBB槡BBBB| 国产一级a爱做片免费☆观看| 双飞人妻13p| www.蜜桃| 殴美色色网| 久久久久三级| 超碰P| 大地中文资源5页的更新内容| 狠狠热视频| 热久久伊人| 天天操夜夜操人人操| 日韩激情无码一区二区| 学生妹一级J人片内射视频| 五月天婷婷丁香| 91麻豆视频| 亚洲无码三级片在线观看| 91在线无码精品秘软件| 成人免费AV| 午夜福利AV在线| 亚洲无码1区| 亚洲av免费在线| 麻豆91精品人妻成人无码| 青青草超碰| 欧美国产日韩综合在线观看170 | 99久久99九九99九九九| 91丨露脸丨熟女| 欧美精品成人免费片| 在线免费观看国产视频| 中文资源在线观看| 色色五月丁香婷婷| 奇米一区| 丁香五月AV| 亚洲欧美成人在线| 体内射精免费视频| 国产精品v欧美精品v日韩精品| 日韩高清无码观看| 好男人WWW一区二区三区| 国产精品无码成人AV在线播放 | 久久午夜无码鲁丝片主演是谁| 国产男女AV| 少妇综合网| 77777免费观看电视剧推荐爱的教育| 国产中文字幕亚洲综合欧美| 一牛影视精品av| 日韩小视频+国产| 欧美大香蕉伊人| 大香蕉网伊| 蜜桃av秘无码一区二区三区| 国产曰韩欧美综合另类在线| 蜜臀av一区| 五月六月丁香| 四虎A片| 亚洲第一页在线观看| 国产免费无码一区二区| 欧美干干| 国产精品在线免费观看| 99在线看| 色色视频网站| 无码a区天堂| 天天欧美| 蜜桃91在线观看| 亚洲AV无一区二区三区久久| 亚洲有码在线观看| 国产系列每日更新| 久久色在线视频| 免费国产成人看片在线| 哪里能看毛片| 一级女婬片A片AAAA片| 又a又黄高清无码视频| 国产又黄又大又粗的视频| 粉嫩av一区二区白浆| 国产精品98| 91国产爽黄| 大吊无码| 黄色视频免费观看国产| 初尝人妻滑进去了莹莹视频| 99久久99九九99九九九| 婷婷激情五月| 草逼网视频| 三级片视频在线观看| 丁香五月婷婷网| 性爱综合网| 天天天天色| 国产激情一区二区三区| 国产精品无码天天爽视频| 亚洲第一影院| 日韩精品毛片一区二区视频免费| 奥门黄片| 国产一级黄色录像| 国产成人高清| 欧美天堂在线观看| 亚洲成人网站在线| 啪啪成人网| 亚洲女同在线| 久久国产高清| 水蜜桃视频网| 国产精品一级无码免费播放| 成人免费A片在线观看直播96| AV中文字幕在线播放| 久草社区| 亚州操B| 亚洲欧美视频一区| 无码精品一区二区| 婷婷开心色四房播播免费| 黄片网站免费在线观看| 久久艹逼| 乱伦中文| 久久成人久久爱| 国产区欧美去区在线| 麻豆av无码| 性毛片| 亚洲精品国产精品国自产网站| 成人精品无码免费视频| 中文字幕亚洲在线| AV电影在线免费观看| 久久久久久婷婷| 中文字幕有码视频| 亚洲中文字幕无码爆乳av| 先锋影音资源AV| 91在线超碰| 久草一区二区三区| 欧美成人一级片| 99在线视频精品| 乱码中文字幕日韩欧美在线| 午夜专区| A级毛片在线观看| 中文字幕免费视频在线播放| 亚洲天堂AV在线观看| 亚洲精品一级二级三级| 91精品人妻一区二区| 国产精品香蕉国产| 亚洲AV无码| 国产成人免费视频| 国产中文字幕在线免费观看| 精品在线一区| 免费看日韩视频| 日韩欧美大片在线观看| 日韩久久综合| 狼人社區91國產精品| 欧美操逼电影| 中文字幕在线精品| 国产手机AV在线| 成人丁香五月| 狠狠干在线视频| 一级国产片| 无码内射在线播放| 狠狠躁日日躁夜夜躁A片无码视频| 亚洲无码一区二区三区妃光| 国产无套内射视频| 蜜臀在线视频| 中文字幕日韩有码| 91九色91蝌蚪91窝成人| 国产一级婬片A片免费妖精视频 | 亚洲午夜成人精品一区二区| 俺去听听婷婷| 天天插天天爽| 国色天香网站| 国产精品97| 国产伦精品一区二区三区妓女下载| 在线观看日韩AV| 国产精品乱伦| 中文字幕av一区| 无码人妻一区二区三区免费n狂飙 性猛交AAAA片免费看蜜桃视频 | 国产av大全| 99久久大香蕉| 超碰三级| 国产精品视频一区二区三区在线观看 | 国产www视频| 日韩无码三级| 亚洲日韩免费在线观看| 中文字幕区| 丁香六月| 无码视频中文字幕| 人人射人人操| 人人射人人摸| 俺去草| 牛牛成人在线视频| 一级黄色视频免费观看| jizzjizz国产| 秋霞欧美在线| 中文日韩欧美| 国产精品久久久久久最猛| 91人妻最真实刺激绿帽| 日韩欧美不卡色不卡| 亚洲伊人大香蕉| 玉米地一级婬片A片| 一区高清| 性V天堂| 日韩黄色A片| 国产毛片在线视频| 美女黄色视频永费在线观看网站 | 日韩欧美操| 在线免费观看黄片| 国产在线观看免费成人视频| 亚洲一卡二卡三卡四卡免| 黄片免费观看视频| 免费肏屄| 日本高清无码视频| 国外成人在线视频老鸭窝| 国产成人tv| 四虎A片| 在线不卡免费Av| 在线观看国产小视频| 成人在线网| 人人看,人人摸| 欧洲一级片| 88av在线播放| 成人视频免费网站| 韩国一级AV| 日韩极品视频| 亚洲国产色婷婷| 97色在线| 桃色Av| 中文在线永久免费观看| 毛片性爱视屏| 日韩久久免费视频| 91在线无码精品秘软件| 久草视频观看| 亚洲色男人天堂| 伊人福利导航| 四川少妇搡BBw搡BBBB搡| 亚洲色图成人网| 69av视频在线观看| 午夜久久久| 精品蜜桃秘一区二区三区观看| 国产成人在线免费| 在线看片国产| 成人a片在线观看| 女人一区二区| 国产精品视频久久久| 超碰人人干人人操| 午夜精品秘一区二区三区| 一级黄色A片视频| 亚洲第一影院| 黄色A片免费视频| 狠狠色婷婷| 12—13女人毛片毛片| 日韩理论片| 黄网在线播放| 欧美视频免费操逼图。| 午夜福利91| 西西4444WWW无视频| 北条麻妃黄色视频| 精品蜜桃秘一区二区三区观看| 一级a一级a爱片免费免免高潮| 欧美爱爱试看| 中国九九盗摄偷拍偷看| 一卡二卡三卡无码| 国产一级婬片A片| 国产精品成人在线视频| 精品视频久久| 色色影音先锋| 精品无码一区二区三区四区久久久软件 | 欧美在线看片| 五月天婷婷视频| 永久免费黄色视频网站| av手机版| 一本色道久久综合狠狠躁| 天天操天天日天天射| 97超碰免费| 亚洲AV无码成人专区| 暗呦罗莉精品一区二区| 3344在线观看免费下载视频 | 青青草原成人在线视频| 美女一级变态毛片| 亚洲成人无码一区| 五月丁香婷婷成人| 国产传媒在线| 日韩三级片在线播放| 国产无码一区| 撸一撸AV| 日韩va亚洲va欧美va高清| 91久久国产综合久| 人妻操逼视频| 亚洲精品影院| 中国老女人性爱视频| 豆花成人在线| 国产成人午夜福利在线| 在线无.码| 婷婷色图| 欧美亚洲综合在线| AV在线播放中文字幕| 操小骚逼视频| 亚洲无码中| 美女网站黄| 99热5| 伊人网视频在线播放| 女人的天堂av| 久久国产免费视频| 国产喷水ThePorn| 久久黑人| 美女操b| 操逼网123| 亚洲秘一区二区三区-精品亚洲二区-| 北岛玲视频在线| 成人国产在线观看| 五月激情六月婷婷| 亚洲美女喷水视频| 91精品国产日韩91久久久久久 | 人人鲁人人操| 日韩av在线不卡| 一本色道久久综合熟妇| 亚洲高清电影| 美国无码黄片| 国产成人大片| 国产视频成人| 网络自拍亚洲激情| 久久精品一区二区三区蜜芽的特点 | 日本一本在线| 另类色| 一区二区三区无码在线观看| 91亚洲精品视频在线| 俺来了俺去了www色官网| 亚洲av电影网| 午夜第一页| 亚洲AV自拍| 水密桃网站| 成人在线激情| 日韩中字无码黄片| 成人特级毛片| 国产精品你懂得| 久久精品综合| 亚洲成人性爱网| va婷婷在线免费观看| 国产精品久久久久久久久久二区三区| 91爽爽| 五月天三级片| 国产精品毛片一区视频播| 亚洲香蕉在线| 欧一美一伦一A片| 香蕉91视频| 91丨九色丨老熟女探花| 国产麻豆电影在线观看| 尤物网在线| 麻豆AV片| 天天干强奸视频在线综合| 免费a视频在线观看| 伊人精品| 黄色天堂天天看| 日批免费网站| 亚洲制服中文字幕| 永久免费看片视频5355| 成人肏逼视频| 奇米无码| 日本三级久久| 一级A片60分钟免费看| 日韩啪啪啪网站| 免费av一区二区| 成人无码毛片| 内射婷婷| 精品九九九| 91精品久久久久久久久| 亚洲国产成人久久| 免费无码在线看| av无码网站| 亚洲视频欧美视频| www操逼| 日韩无码五月天| 亚洲无码免费在线视频| 69无码| 欧美在线黄片| 欧美色图视频网站| 麻豆免费成人视频| 无码人妻熟妇| 91视频精品| 日韩爱爱免费视频| 波多野结衣福利视频| 操B网站| 青青自拍视频| 欧美喷水视频| 国产不卡在线| 亚洲免费观看高清完整版在线| 91精品视频在线免费观看| 99性视频| 久久成人网豆花视频| 噜噜噜网| 欧美一级片在线观看| 秋霞福利网| 丁香综合网| 亚洲AV无码国产综合专区| 中文字幕成人网站中文字幕| 99精品视频在线观看| 97A片在线观看播放| 国产欧美在线免费观看| 久久性爱网站| 人妻体内射精一区二区三区| 免费A片在线看| 高清无码免费在线| 一级A片免费| 在线观看精品视频| 人人爽爽人人| 国产一级婬女AAAA片季秀英| 99久视频| 天天干天| 亚洲在线观看中文字幕| 女女女女女女BBBBBB手| 无码一级| 69成人精品国产| 久久久久亚洲AV无码麻豆| 色猫咪av| 黄片视频在线免费播放| 懂色中文字幕| 影音先锋成人资源站| 人人操人人摸人人爱| 操操片| 国产精品啪啪啪啪| av操逼网| 久久蜜| 成人久久视频| 国产三级小视频| 91三级片网站| 嫩BBB槡BBBB槡BBBB| 亚洲天堂一级片| 日本免费在线| 成人三级视频在线观看| 久久99精品久久久久久水蜜桃| 青青综合网| 97人妻人人操| 亚洲女与黑人正在播放| 国产中文字幕在线播放| 色婷婷一级A片AAA毛片| 婷婷精品免费久久| 色琪琪在线视频| 手机在线一区| 人人操人人看人人摸| 伊人成人在线观看| 成人三级AV| 天天操夜| 丰满人妻一区二区三区视频54| 国产av综合网| 翔田千里53歳在线播放| 91愛爱| 日韩爱爱| 中文字幕在线亚洲| 中文字幕日韩高清| 欧美久久免费| 国产乱子伦一区二区三区免看| AV无码人妻| 韩国午夜福利视频| 高清无码免费视频| h无码| 国产黄色视频免费观看| 欧美VA| 丰满人妻一区二区三区视频54| 国产精品国产三级国产AⅤ中文| 久久艹精品视频| 青青草成人免费在线视频| 伊人大香蕉在线| 日韩电影无码| 久久久成人视频| 国产AV日韩AV| 天天爽夜夜| 精品欧美成人片在线| 在线观看免费人成视频| 欧美aaaaaa| 亚洲AV五月天在线| 日韩免费AV| 久久思思热| 婷婷五月天在线播放| 伊人久久中文字幕| 久久国产高清| 免费成人视频| 成人伊人综合网| 中文资源在线观看| 国产女人水真多18毛片18精品| 国产逼逼| 欧美性极品少妇精品网站| 在线一区| 怡春院免费视频| 亚洲激情五月天| 欧美三级欧美一级| 中文乱伦视频| 18岁成人毛片| 国产伦子伦一级A片在线| 狠狠色噜噜狠狠狠7777| 日日爽夜夜| 操逼免费看| 国内精品久久久| 亚洲免费三级| AV在线影院| 影音先锋国产AV| 天天天天天天天操| 欧美级黑寡妇毛片app| jizz在线观看免费视频| 国产毛片欧美毛片高潮| 东京热久久综合色五月老师| 亚洲秘无码一区二区三区观看| 日韩无码一二三| 亚洲av电影网| 男女做爱视频网站| 加勒比无码在线播放| 91毛片在线观看| 大香蕉这里只有精品| 91AV在线免费观看| 亚洲阿v天堂| 天天看高清无码| 日韩无码一区二区三| 无码日逼视频| 伊人久久大综合中文无码| 猫咪视频大全视频| 国产三级视频| 免费看a| 五月丁香六月婷| 亚洲玖玖爱| 伊人久久大香线蕉av一区| 91蝌蚪网| 亲子伦一区二区三区| jk在线观看| 可以免费看AV的网站| 91精品国产乱码香蕉黄瓜草莓| 特一级黄色视频| 久久成人影音| 无码一区二区黑人猛烈视频网站| 久久无码人妻精品一区二区三区| 不卡无码免费视频| 国产AV一卡| 91福利资源| 特级毛片av| 青青草视频免费看| 中文字幕88页| 俺来也俺去也www色| 日韩av中文在线| 88AV视频| 日韩无码人妻久久一区二区三区| 久久大香蕉| a在线观看| 丁香五月在线| 91热| 免费A级毛片| 欧美日韩中文字幕无码| 91在线视频播放| 亚洲成人免费视频| 久操久操| 制服.丝袜.亚洲.中文豆花| 亚洲天堂免费视频| 成人在线网| 乱伦视频网| 樱桃av| 天天日天天爽| 黄色一区二区三区| 蜜桃91精品秘入口| 日韩人妻无码精品| 亚洲天堂在线视频| 无码免费视频| 日本高清色清di免费观看| 国产日本欧美韩国久久久久| 欧美一二三区黄色免费视屏| 熊猫AⅤ| 国产熟女一区二区久久| 男女啪网| 久久久国产精品人人片| 麻豆黄网| 中午字幕在线观看| 极品在线视频| 色婷婷AV在线观看| 成人国产无码| 亚洲黄色在线免费观看| 欧美日韩性色无码免费| 久久人体视频| 午夜亚洲精品| 中文字幕在线免费观看电影| 中国特级毛片| 爱操综合| 口爆AV| 午夜蜜桃人妻一区二区| 无码免费一区| 国产香蕉网| 人妻体内射精一区二区| 淫香淫色综合网| 国产成人一区二区三区| 久久影音先锋| 日韩AV免费在线观看| 日韩在线中文字幕| 中文字幕观看av| 黄色视频在线免费观| 亚洲成人a片| 久久艹骚逼| 操屄视频免费观看| 国产精品色综合| 91嫩操| 国产一级a毛一级a毛视频在线网站) | 亚洲高清无码在线观看| 亚洲日韩乱码在线| 午夜美女视频| 中字幕视频在线永久在线观看免费| 日韩中文字幕一区二区| 成人AV午夜福利| xxxxxbbbbb| 天天夜夜操| 成人小说一区二区三区| 99热免费观看| 欧美日批| 少妇大战黑人46厘米| 久草福利| 久久精品视频观看| 国产三级偷拍| 99热精品2| 自拍偷拍视频网| 欧美伊人久久| 欧美高清无码视频| 精品午夜福利| 男人的天堂黄色| 五月丁香综合| 美日韩在线观看| 美日韩A片| 一卡二卡在线视频| 欧美亚洲视频在线观看| 日韩成人一级片| 在线免费观看亚洲| 午夜av在线观看| 欧美狠狠操| 麻豆一级片| 蜜臀激情| 欧美性爱a视频| 亚洲一区高清| 熟妇槡BBBB槡BBBB图| 亚洲国产毛片| 日本A在线| 日本黄色电影网址| 亚洲无码A片在线观看APP| 日本肏逼视频| 五月丁香婷中文字幕| 在线www| 江苏妇搡BBB搡BBBB| 欧美午夜三级| 蜜桃传媒一区二区亚洲AV| 亚洲一区二区在线| 亚洲人妻电影一区| 免费福利视频网站| 奇米色网| 亚洲成人无码av| 久久久久久久免费视频| 天天干天天做| 久久99高清视频| 一级特黄大片录像i| 欧美h在线观看| 狼人香蕉网| 26∪u∪成人网站| 成人免费三级片| 综合色国产精品欧美在线观看| av黄色网| 仓井空一区二区三区| 狠狠躁日日躁夜夜躁A片小说免费| 成人在线黄色| 久久人妻熟女中文字幕av蜜芽| 大香蕉伊人网| 欧美精品| 69成人在线电影| 囯产精品一区二区三区线一牛影视1| 久久久亚洲熟妇熟女| 欧洲精品在线观看| 国产一级a毛一级a做免费的视频l| 嫩BBB槡BBBB槡BBBB| 亚洲免费视频一区| 热久久9| 中国熟妇XXXX18| 人妻电影亚洲av| 无码主播| аⅴ资源新版在线天堂| 三级网站免费观看| 国产精品性爱| 性99网站| 日日射视频| 三级黄色视频在线观看| 国产一区二区成人久久919色| 狠狠干网| 久草黄色电影| 2020无码| 亚洲无码精品一区| 国产AⅤ爽aV久久久久成人| 国产黄色免费看| 成人a片在线免费观看| av一区在线观看| 五月天综合| 欧美狠狠操| 香蕉漫画在线观看18| 国产精品啪啪啪啪| www.丁香五月| 麻豆国产一区二区三区四区| 国产成人久久| 久久久久久久久久久亚洲| 超碰人| 天天日夜夜添| 麻豆AV96熟妇人妻| 8050午夜一级免费| 欧美级黑寡妇毛片app| 一级片av| AA无码| 亚洲精品成人片在线观看精品字幕 | 精品小视频| 性欧美成人播放77777| 久久久高清无码视频| 黄页网址在线观看| 97人妻人人澡| 在线观看av中文字幕| 97午夜福利视频| 超碰免费观看| 国产精品性爱| 水果派解说A∨无码区| 久久久久久大香蕉| 97大香蕉视频| 超碰在线观看97| 亚洲AV无码成人精品区东京热| 天天色色天天| 少妇白洁在线观看| 国产成人无码A片V99| 国产一级A片免费看| 一级黄色视频免费观看| 男人天堂社区| 无码一区精品久久久成人| 熟女伦乱| 一级A片免费| 特级444WWW大胆高清| 69视频在线免费观看| 99久久国产热无码精品免费| 无码a片| 久久6| 精精国产| 中文字幕福利视频| 久草99| 蝌蚪窝免费在线视频| av婷婷五月天| 老司机无码视频| 黄色视频白丝| 欧美少妇做爱| 干屄网| 无码高清| 操逼激情视频| 丁香五月六月| 国产成人高清| 亚洲内射无码| 欧洲成人午夜精品无码区久久| 在线无码一区| 国产极品久久久| 三级片视频在线观看| 91av成人| 久久大伊人| 人妻无码一区二区三区| 中文字幕亚洲综合| 国产成人女人在线观看| 99久久国产热无码精品免费| 久久久久亚洲AV成人网人人软件 | 久久av影院| 99这里有精品| 国产高清无码在线观看| 国产精品久久7777777精品无码| 国产精品免费人成人网站酒店| 国产精品秘久久久久久久久 | 污视频网站在线观看| 中文字幕日韩在线观看| 久久911| 欧美熟妇BBB搡BBB| 日本无码视频在线观看| 欧美h网站| 亚州免费视频| 成人黄色电影在线观看| 一级片电影网站| 亚洲a片在线观看| 久热免费视频| 99热青青| 午夜AAA| 午夜福利不卡视频| 日韩欧美人妻无码精品| 操逼视频免费播放| 就去色色五月丁香婷婷久久久| 91亚洲国产成人久久精品网站 | 四季AV一区二区夜夜嗨| A黄色绿像| 日韩久久婷婷| 国产三级电影在线观看| 激情视频免费看| 欧美精品一卡二卡| 日韩成人综合| 日逼老女人| 成人高清无码视频| 国产无套进入免费| 国产aaaaaaaaaa| 俄女兵一级婬片A片| 澳门簧片| 无码黄漫|