亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > C++ > 正文

C++智能指針實(shí)例詳解

2020-05-23 14:24:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了C++智能指針實(shí)例詳解,需要的朋友可以參考下
 
 

本文通過(guò)實(shí)例詳細(xì)闡述了C++關(guān)于智能指針的概念及用法,有助于讀者加深對(duì)智能指針的理解。詳情如下:

一、簡(jiǎn)介

由于 C++ 語(yǔ)言沒(méi)有自動(dòng)內(nèi)存回收機(jī)制,程序員每次 new 出來(lái)的內(nèi)存都要手動(dòng) delete。程序員忘記 delete,流程太復(fù)雜,最終導(dǎo)致沒(méi)有 delete,異常導(dǎo)致程序過(guò)早退出,沒(méi)有執(zhí)行 delete 的情況并不罕見(jiàn)。
用智能指針便可以有效緩解這類(lèi)問(wèn)題,本文主要講解參見(jiàn)的智能指針的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost:: intrusive_ptr。你可能會(huì)想,如此多的智能指針就為了解決new、delete匹配問(wèn)題,真的有必要嗎?看完這篇文章后,我想你心里自然會(huì)有答案。

下面就按照順序講解如上 7 種智能指針(smart_ptr)。
 
二、具體使用

1、總括

對(duì)于編譯器來(lái)說(shuō),智能指針實(shí)際上是一個(gè)棧對(duì)象,并非指針類(lèi)型,在棧對(duì)象生命期即將結(jié)束時(shí),智能指針通過(guò)析構(gòu)函數(shù)釋放有它管理的堆內(nèi)存。所有智能指針都重載了“operator->”操作符,直接返回對(duì)象的引用,用以操作對(duì)象。訪問(wèn)智能指針原來(lái)的方法則使用“.”操作符。

訪問(wèn)智能指針包含的裸指針則可以用 get() 函數(shù)。由于智能指針是一個(gè)對(duì)象,所以if (my_smart_object)永遠(yuǎn)為真,要判斷智能指針的裸指針是否為空,需要這樣判斷:if (my_smart_object.get())。

智能指針包含了 reset() 方法,如果不傳遞參數(shù)(或者傳遞 NULL),則智能指針會(huì)釋放當(dāng)前管理的內(nèi)存。如果傳遞一個(gè)對(duì)象,則智能指針會(huì)釋放當(dāng)前對(duì)象,來(lái)管理新傳入的對(duì)象。
我們編寫(xiě)一個(gè)測(cè)試類(lèi)來(lái)輔助分析:

class Simple { public: Simple(int param = 0) {  number = param;  std::cout << "Simple: " << number << std::endl;  } ~Simple() {  std::cout << "~Simple: " << number << std::endl; } void PrintSomething() {  std::cout << "PrintSomething: " << info_extend.c_str() << std::endl; } std::string info_extend; int number;};

2、std::auto_ptr

std::auto_ptr 屬于 STL,當(dāng)然在 namespace std 中,包含頭文件 #include<memory> 便可以使用。std::auto_ptr 能夠方便的管理單個(gè)堆內(nèi)存對(duì)象。

我們從代碼開(kāi)始分析:

void TestAutoPtr() {std::auto_ptr<Simple> my_memory(new Simple(1));  // 創(chuàng)建對(duì)象,輸出:Simple:1if (my_memory.get()) {              // 判斷智能指針是否為空my_memory->PrintSomething();          // 使用 operator-> 調(diào)用智能指針對(duì)象中的函數(shù)my_memory.get()->info_extend = "Addition";   // 使用 get() 返回裸指針,然后給內(nèi)部對(duì)象賦值my_memory->PrintSomething();          // 再次打印,表明上述賦值成功(*my_memory).info_extend += " other";      // 使用 operator* 返回智能指針內(nèi)部對(duì)象,然后用“.”調(diào)用智能指針對(duì)象中的函數(shù)my_memory->PrintSomething();          // 再次打印,表明上述賦值成功 }}                       //my_memory棧對(duì)象即將結(jié)束生命期,析構(gòu)堆對(duì)象Simple(1)

執(zhí)行結(jié)果為:

Simple: 1PrintSomething:PrintSomething: AdditionPrintSomething: Addition other~Simple: 1

上述為正常使用 std::auto_ptr 的代碼,一切似乎都良好,無(wú)論如何不用我們顯示使用該死的 delete 了。
 
其實(shí)好景不長(zhǎng),我們看看如下的另一個(gè)例子:

void TestAutoPtr2() { std::auto_ptr<Simple> my_memory(new Simple(1)); if (my_memory.get()) {  std::auto_ptr<Simple> my_memory2;  // 創(chuàng)建一個(gè)新的 my_memory2 對(duì)象  my_memory2 = my_memory;       // 復(fù)制舊的 my_memory 給 my_memory2  my_memory2->PrintSomething();    // 輸出信息,復(fù)制成功  my_memory->PrintSomething();    // 崩潰 }}

最終如上代碼導(dǎo)致崩潰,如上代碼時(shí)絕對(duì)符合 C++ 編程思想的,居然崩潰了,跟進(jìn) std::auto_ptr 的源碼后,我們看到,罪魁禍?zhǔn)资?ldquo;my_memory2 = my_memory”,這行代碼,my_memory2 完全奪取了 my_memory 的內(nèi)存管理所有權(quán),導(dǎo)致 my_memory 懸空,最后使用時(shí)導(dǎo)致崩潰。

所以,使用 std::auto_ptr 時(shí),絕對(duì)不能使用“operator=”操作符。作為一個(gè)庫(kù),不允許用戶使用,確沒(méi)有明確拒絕,多少會(huì)覺(jué)得有點(diǎn)出乎預(yù)料。
 
看完 std::auto_ptr 好景不長(zhǎng)的第一個(gè)例子后,讓我們?cè)賮?lái)看一個(gè):

void TestAutoPtr3() { std::auto_ptr<Simple> my_memory(new Simple(1));  if (my_memory.get()) {  my_memory.release(); }}

執(zhí)行結(jié)果為:

Simple: 1

看到什么異常了嗎?我們創(chuàng)建出來(lái)的對(duì)象沒(méi)有被析構(gòu),沒(méi)有輸出“~Simple: 1”,導(dǎo)致內(nèi)存泄露。當(dāng)我們不想讓 my_memory 繼續(xù)生存下去,我們調(diào)用 release() 函數(shù)釋放內(nèi)存,結(jié)果卻導(dǎo)致內(nèi)存泄露(在內(nèi)存受限系統(tǒng)中,如果my_memory占用太多內(nèi)存,我們會(huì)考慮在使用完成后,立刻歸還,而不是等到 my_memory 結(jié)束生命期后才歸還)。

正確的代碼應(yīng)該為:

void TestAutoPtr3() { std::auto_ptr<Simple> my_memory(new Simple(1)); if (my_memory.get()) {  Simple* temp_memory = my_memory.release();  delete temp_memory; }}

void TestAutoPtr3() { std::auto_ptr<Simple> my_memory(new Simple(1)); if (my_memory.get()) {  my_memory.reset(); // 釋放 my_memory 內(nèi)部管理的內(nèi)存 }}

原來(lái) std::auto_ptr 的 release() 函數(shù)只是讓出內(nèi)存所有權(quán),這顯然也不符合 C++ 編程思想。
總結(jié):std::auto_ptr 可用來(lái)管理單個(gè)對(duì)象的對(duì)內(nèi)存,但是,請(qǐng)注意如下幾點(diǎn):

(1)    盡量不要使用“operator=”。如果使用了,請(qǐng)不要再使用先前對(duì)象。
(2)    記住 release() 函數(shù)不會(huì)釋放對(duì)象,僅僅歸還所有權(quán)。
(3)    std::auto_ptr 最好不要當(dāng)成參數(shù)傳遞(讀者可以自行寫(xiě)代碼確定為什么不能)。
(4)    由于 std::auto_ptr 的“operator=”問(wèn)題,有其管理的對(duì)象不能放入 std::vector 等容器中。
使用一個(gè) std::auto_ptr 的限制還真多,還不能用來(lái)管理堆內(nèi)存數(shù)組,這應(yīng)該是你目前在想的事情吧,我也覺(jué)得限制挺多的,哪天一個(gè)不小心,就導(dǎo)致問(wèn)題了。
由于 std::auto_ptr 引發(fā)了諸多問(wèn)題,一些設(shè)計(jì)并不是非常符合 C++ 編程思想,所以引發(fā)了下面 boost 的智能指針,boost 智能指針可以解決如上問(wèn)題。
讓我們繼續(xù)向下看。
 
3、boost::scoped_ptr

boost::scoped_ptr 屬于 boost 庫(kù),定義在 namespace boost 中,包含頭文件 #include<boost/smart_ptr.hpp> 便可以使用。boost::scoped_ptr 跟 std::auto_ptr 一樣,可以方便的管理單個(gè)堆內(nèi)存對(duì)象,特別的是,boost::scoped_ptr 獨(dú)享所有權(quán),避免了 std::auto_ptr 惱人的幾個(gè)問(wèn)題。
我們還是從代碼開(kāi)始分析:

void TestScopedPtr() { boost::scoped_ptr<Simple> my_memory(new Simple(1)); if (my_memory.get()) {  my_memory->PrintSomething();  my_memory.get()->info_extend = "Addition";  my_memory->PrintSomething();  (*my_memory).info_extend += " other";  my_memory->PrintSomething();    my_memory.release();      // 編譯 error: scoped_ptr 沒(méi)有 release 函數(shù)  std::auto_ptr<Simple> my_memory2;  my_memory2 = my_memory;    // 編譯 error: scoped_ptr 沒(méi)有重載 operator=,不會(huì)導(dǎo)致所有權(quán)轉(zhuǎn)移 }}

首先,我們可以看到,boost::scoped_ptr 也可以像 auto_ptr 一樣正常使用。但其沒(méi)有 release() 函數(shù),不會(huì)導(dǎo)致先前的內(nèi)存泄露問(wèn)題。其次,由于 boost::scoped_ptr 是獨(dú)享所有權(quán)的,所以明確拒絕用戶寫(xiě)“my_memory2 = my_memory”之類(lèi)的語(yǔ)句,可以緩解 std::auto_ptr 幾個(gè)惱人的問(wèn)題。
    由于 boost::scoped_ptr 獨(dú)享所有權(quán),當(dāng)我們真真需要復(fù)制智能指針時(shí),需求便滿足不了了,如此我們?cè)僖胍粋€(gè)智能指針,專(zhuān)門(mén)用于處理復(fù)制,參數(shù)傳遞的情況,這便是如下的 boost::shared_ptr。
 
4、boost::shared_ptr

boost::shared_ptr 屬于 boost 庫(kù),定義在 namespace boost 中,包含頭文件 #include<boost/smart_ptr.hpp> 便可以使用。在上面我們看到 boost::scoped_ptr 獨(dú)享所有權(quán),不允許賦值、拷貝,boost::shared_ptr 是專(zhuān)門(mén)用于共享所有權(quán)的,由于要共享所有權(quán),其在內(nèi)部使用了引用計(jì)數(shù)。boost::shared_ptr 也是用于管理單個(gè)堆內(nèi)存對(duì)象的。
我們還是從代碼開(kāi)始分析:

void TestSharedPtr(boost::shared_ptr<Simple> memory) { // 注意:無(wú)需使用 reference (或 const reference) memory->PrintSomething(); std::cout << "TestSharedPtr UseCount: " << memory.use_count() << std::endl;} void TestSharedPtr2() { boost::shared_ptr<Simple> my_memory(new Simple(1)); if (my_memory.get()) {  my_memory->PrintSomething();  my_memory.get()->info_extend = "Addition";  my_memory->PrintSomething();  (*my_memory).info_extend += " other";  my_memory->PrintSomething(); }  std::cout << "TestSharedPtr2 UseCount: " << my_memory.use_count() << std::endl; TestSharedPtr(my_memory); std::cout << "TestSharedPtr2 UseCount: " << my_memory.use_count() << std::endl;  //my_memory.release();// 編譯 error: 同樣,shared_ptr 也沒(méi)有 release 函數(shù)}

執(zhí)行結(jié)果為:

Simple: 1PrintSomething:PrintSomething: AdditionPrintSomething: Addition otherTestSharedPtr2 UseCount: 1PrintSomething: Addition otherTestSharedPtr UseCount: 2TestSharedPtr2 UseCount: 1~Simple: 1

boost::shared_ptr 也可以很方便的使用。并且沒(méi)有 release() 函數(shù)。關(guān)鍵的一點(diǎn),boost::shared_ptr 內(nèi)部維護(hù)了一個(gè)引用計(jì)數(shù),由此可以支持復(fù)制、參數(shù)傳遞等。boost::shared_ptr 提供了一個(gè)函數(shù) use_count() ,此函數(shù)返回 boost::shared_ptr 內(nèi)部的引用計(jì)數(shù)。查看執(zhí)行結(jié)果,我們可以看到在 TestSharedPtr2 函數(shù)中,引用計(jì)數(shù)為 1,傳遞參數(shù)后(此處進(jìn)行了一次復(fù)制),在函數(shù)TestSharedPtr 內(nèi)部,引用計(jì)數(shù)為2,在 TestSharedPtr 返回后,引用計(jì)數(shù)又降低為 1。當(dāng)我們需要使用一個(gè)共享對(duì)象的時(shí)候,boost::shared_ptr 是再好不過(guò)的了。
在此,我們已經(jīng)看完單個(gè)對(duì)象的智能指針管理,關(guān)于智能指針管理數(shù)組,我們接下來(lái)講到。
 
5、boost::scoped_array

boost::scoped_array 屬于 boost 庫(kù),定義在 namespace boost 中,包含頭文件 #include<boost/smart_ptr.hpp> 便可以使用。
    boost::scoped_array 便是用于管理動(dòng)態(tài)數(shù)組的。跟 boost::scoped_ptr 一樣,也是獨(dú)享所有權(quán)的。

我們還是從代碼開(kāi)始分析:

void TestScopedArray() {   boost::scoped_array<Simple> my_memory(new Simple[2]); // 使用內(nèi)存數(shù)組來(lái)初始化   if (my_memory.get()) {    my_memory[0].PrintSomething();    my_memory.get()[0].info_extend = "Addition";    my_memory[0].PrintSomething();    (*my_memory)[0].info_extend += " other";      // 編譯 error,scoped_ptr 沒(méi)有重載 operator*    my_memory[0].release();               // 同上,沒(méi)有 release 函數(shù)    boost::scoped_array<Simple> my_memory2;    my_memory2 = my_memory;               // 編譯 error,同上,沒(méi)有重載 operator=   }  }

boost::scoped_array 的使用跟 boost::scoped_ptr 差不多,不支持復(fù)制,并且初始化的時(shí)候需要使用動(dòng)態(tài)數(shù)組。另外,boost::scoped_array 沒(méi)有重載“operator*”,其實(shí)這并無(wú)大礙,一般情況下,我們使用 get() 函數(shù)更明確些。

下面肯定應(yīng)該講 boost::shared_array 了,一個(gè)用引用計(jì)數(shù)解決復(fù)制、參數(shù)傳遞的智能指針類(lèi)。
 
6、boost::shared_array
boost::shared_array 屬于 boost 庫(kù),定義在 namespace boost 中,包含頭文件 #include<boost/smart_ptr.hpp> 便可以使用。

由于 boost::scoped_array 獨(dú)享所有權(quán),顯然在很多情況下(參數(shù)傳遞、對(duì)象賦值等)不滿足需求,由此我們引入 boost::shared_array。跟 boost::shared_ptr 一樣,內(nèi)部使用了引用計(jì)數(shù)。

我們還是從代碼開(kāi)始分析:

void TestSharedArray(boost::shared_array<Simple> memory) { // 注意:無(wú)需使用 reference (或 const reference) std::cout << "TestSharedArray UseCount: " << memory.use_count() << std::endl;} void TestSharedArray2() { boost::shared_array<Simple> my_memory(new Simple[2]); if (my_memory.get()) {  my_memory[0].PrintSomething();  my_memory.get()[0].info_extend = "Addition 00";  my_memory[0].PrintSomething();  my_memory[1].PrintSomething();  my_memory.get()[1].info_extend = "Addition 11";  my_memory[1].PrintSomething();  //(*my_memory)[0].info_extend += " other"; // 編譯 error,scoped_ptr 沒(méi)有重載 operator* } std::cout << "TestSharedArray2 UseCount: " << my_memory.use_count() << std::endl; TestSharedArray(my_memory); std::cout << "TestSharedArray2 UseCount: " << my_memory.use_count() << std::endl;}

執(zhí)行結(jié)果為:

Simple: 0Simple: 0PrintSomething:PrintSomething: Addition 00PrintSomething:PrintSomething: Addition 11TestSharedArray2 UseCount: 1TestSharedArray UseCount: 2TestSharedArray2 UseCount: 1~Simple: 0~Simple: 0

跟 boost::shared_ptr 一樣,使用了引用計(jì)數(shù),可以復(fù)制,通過(guò)參數(shù)來(lái)傳遞。
 
至此,我們講過(guò)的智能指針有 std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array。這幾個(gè)智能指針已經(jīng)基本夠我們使用了,90% 的使用過(guò)標(biāo)準(zhǔn)智能指針的代碼就這 5 種??扇缦逻€有兩種智能指針,它們肯定有用,但有什么用處呢,一起看看吧。
 
7、boost::weak_ptr

boost::weak_ptr 屬于 boost 庫(kù),定義在 namespace boost 中,包含頭文件 #include<boost/smart_ptr.hpp> 便可以使用。
在講 boost::weak_ptr 之前,讓我們先回顧一下前面講解的內(nèi)容。似乎 boost::scoped_ptr、boost::shared_ptr 這兩個(gè)智能指針就可以解決所有單個(gè)對(duì)象內(nèi)存的管理了,這兒還多出一個(gè) boost::weak_ptr,是否還有某些情況我們沒(méi)納入考慮呢?
回答:有。首先 boost::weak_ptr 是專(zhuān)門(mén)為 boost::shared_ptr 而準(zhǔn)備的。有時(shí)候,我們只關(guān)心能否使用對(duì)象,并不關(guān)心內(nèi)部的引用計(jì)數(shù)。boost::weak_ptr 是 boost::shared_ptr 的觀察者(Observer)對(duì)象,觀察者意味著 boost::weak_ptr 只對(duì) boost::shared_ptr 進(jìn)行引用,而不改變其引用計(jì)數(shù),當(dāng)被觀察的 boost::shared_ptr 失效后,相應(yīng)的 boost::weak_ptr 也相應(yīng)失效。
我們還是從代碼開(kāi)始分析:

  void TestWeakPtr() {   boost::weak_ptr<Simple> my_memory_weak;   boost::shared_ptr<Simple> my_memory(new Simple(1));    std::cout << "TestWeakPtr boost::shared_ptr UseCount: " << my_memory.use_count() << std::endl;   my_memory_weak = my_memory;   std::cout << "TestWeakPtr boost::shared_ptr UseCount: " << my_memory.use_count() << std::endl;}

    執(zhí)行結(jié)果為:

Simple: 1TestWeakPtr boost::shared_ptr UseCount: 1TestWeakPtr boost::shared_ptr UseCount: 1~Simple: 1

    我們看到,盡管被賦值了,內(nèi)部的引用計(jì)數(shù)并沒(méi)有什么變化,當(dāng)然,讀者也可以試試傳遞參數(shù)等其他情況。
    現(xiàn)在要說(shuō)的問(wèn)題是,boost::weak_ptr 到底有什么作用呢?從上面那個(gè)例子看來(lái),似乎沒(méi)有任何作用,其實(shí) boost::weak_ptr 主要用在軟件架構(gòu)設(shè)計(jì)中,可以在基類(lèi)(此處的基類(lèi)并非抽象基類(lèi),而是指繼承于抽象基類(lèi)的虛基類(lèi))中定義一個(gè) boost::weak_ptr,用于指向子類(lèi)的 boost::shared_ptr,這樣基類(lèi)僅僅觀察自己的 boost::weak_ptr 是否為空就知道子類(lèi)有沒(méi)對(duì)自己賦值了,而不用影響子類(lèi) boost::shared_ptr 的引用計(jì)數(shù),用以降低復(fù)雜度,更好的管理對(duì)象。
 
8、boost::intrusive_ptr

boost::intrusive_ptr屬于 boost 庫(kù),定義在 namespace boost 中,包含頭文件 #include<boost/smart_ptr.hpp> 便可以使用。
講完如上 6 種智能指針后,對(duì)于一般程序來(lái)說(shuō) C++ 堆內(nèi)存管理就夠用了,現(xiàn)在有多了一種 boost::intrusive_ptr,這是一種插入式的智能指針,內(nèi)部不含有引用計(jì)數(shù),需要程序員自己加入引用計(jì)數(shù),不然編譯不過(guò)(⊙﹏⊙b汗)。個(gè)人感覺(jué)這個(gè)智能指針沒(méi)太大用處,至少我沒(méi)用過(guò)。有興趣的朋友自己研究一下源代碼哦。
 
 
三、總結(jié)

如上講了這么多智能指針,有必要對(duì)這些智能指針做個(gè)總結(jié):

1、在可以使用 boost 庫(kù)的場(chǎng)合下,拒絕使用 std::auto_ptr,因?yàn)槠洳粌H不符合 C++ 編程思想,而且極容易出錯(cuò)。
2、在確定對(duì)象無(wú)需共享的情況下,使用 boost::scoped_ptr(當(dāng)然動(dòng)態(tài)數(shù)組使用 boost::scoped_array)。
3、在對(duì)象需要共享的情況下,使用 boost::shared_ptr(當(dāng)然動(dòng)態(tài)數(shù)組使用 boost::shared_array)。
4、在需要訪問(wèn) boost::shared_ptr 對(duì)象,而又不想改變其引用計(jì)數(shù)的情況下,使用 boost::weak_ptr,一般常用于軟件框架設(shè)計(jì)中。
5、最后一點(diǎn),也是要求最苛刻一點(diǎn):在你的代碼中,不要出現(xiàn) delete 關(guān)鍵字(或 C 語(yǔ)言的 free 函數(shù)),因?yàn)榭梢杂弥悄苤羔樔ス芾怼?/p>


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美一级片免费观看| 国产成人在线观看网站| 里番在线观看网站| 亚洲欧洲日本韩国| 精品视频久久久| 美女扒开尿口让男人操亚洲视频网站| 99精品视频中文字幕| 亚洲欧美精品一区| 黄页网站大全在线免费观看| 欧美猛烈性xbxbxbxb| 欧美大片一区二区三区| 成人情视频高清免费观看电影| 久久性感美女视频| www.久久91| 欧美成人aaa片一区国产精品| 美女一区二区三区视频| 荫蒂被男人添免费视频| 都市激情亚洲欧美| 男生草女生视频| 中文字幕在线观看一区二区三区| 亚洲 日本 欧美 中文幕| 色国产综合视频| 亚洲国产一区二区在线播放| 日本aa大片在线播放免费看| 日产午夜精品一线二线三线| 久久a级毛片毛片免费观看| 综合视频在线观看| 91九色蝌蚪国产| 国产午夜精品在线观看| 91亚洲精品久久久蜜桃借种| 成人黄色三级视频| 久久视频国产精品免费视频在线| 欧美成人免费全部网站| 最近2019年中文视频免费在线观看| 户外露出一区二区三区| 婷婷综合五月天| 欧美一区二区视频| 亚洲午夜网未来影院| 国产精品都在这里| 久久婷婷蜜乳一本欲蜜臀| 久久日文中文字幕乱码| 韩日毛片在线观看| 国产一级黄色录像| 欧美在线小视频| 91女人视频在线观看| 日韩精品免费观看| 久久高清免费视频| 中文字幕一区日韩电影| 久久婷婷五月综合| 亚洲人成网站色ww在线| 久久久久国产精品无码免费看| 久久精品国产美女| 欧美一区二区大片| 欧美黄色aaa| 久久最新免费视频| 领导边摸边吃奶边做爽在线观看| 国产精品沙发午睡系列990531| 免费在线成人av电影| 国产aⅴ综合色| 日韩经典中文字幕在线观看| 免费一级欧美在线大片| 国产无套在线观看| 爆操欧美孕妇| 午夜亚洲伦理| 国产精品进线69影院| 日韩在线资源| 国产精品v日韩精品v欧美精品网站| 天堂网在线.www天堂在线| 成人福利电影精品一区二区在线观看| 国产尤物在线观看| 丁香花电影在线观看完整版| 欧美极品欧美精品欧美| 精品丰满少妇一区二区三区| 国偷自产av一区二区三区小尤奈| 成人毛片在线免费观看| 国产av麻豆mag剧集| 国产高清在线观看视频| 久久不卡国产精品一区二区| 国产精品午夜在线观看| 91精品国产91久久久久| 国产精品入口麻豆高清| 九九热久久66| 久久久久久久9| 久久久夜色精品| 不卡av在线播放| ●精品国产综合乱码久久久久| 中文在线а√天堂官网| 激情av一区二区| 风流老熟女一区二区三区| 亚洲第一激情av| 日韩av网站电影| 波多野结衣影片| 欧美大片免费久久精品三p| 久久久久久久久久久久久久久久久久久| 69影院欧美专区视频| 久久精品女同亚洲女同13| 岛国av在线免费| 伦理中文字幕亚洲| jizz性欧美23| 欧美韩日国产| 亚洲第一搞黄网站| 91久久国产综合久久91精品网站| 国产aⅴ精品一区二区四区| 国产一区视频在线播放| 成人不卡免费av| 欧洲精品99毛片免费高清观看| 午夜精品久久久久久久91蜜桃| 亚洲精品综合网| 欧美色综合网站| 加勒比在线一区二区三区观看| 国产精品久久久久一区二区国产| 黄页网站在线| 青青草一区二区| 国产精品一站二站| 精品少妇人妻一区二区黑料社区| 国产5g影院天天爽天天看| 女人高潮特级毛片| 日本天堂网在线| 91超碰在线免费观看| 国产精品手机在线播放| www.久久久精品| 自拍偷拍欧美| 在线免费不卡视频| 国产亚洲精品久久久久久青梅| a视频在线观看| 国产a∨精品一区二区三区不卡| 亚洲精品国产精品国自产网站| 国产香蕉在线| aa片在线观看视频在线播放| 欧洲一级黄色片| 亚洲欧洲美洲一区二区三区| 69xxxx视频| 欧美videossex| 日韩欧美一级大片| 久久资源综合| 糖心vlog免费在线观看| 完整版免费av片| 欧美五级在线观看视频播放| 超碰在线观看免费版| 久久久久无码国产精品一区| h片精品在线观看| 亚洲婷婷伊人| 日韩精品中文字幕一区二区三区| 一区二区三区在线免费播放| 日韩欧美999| 小泽玛利亚一区二区免费| 欧美极品在线观看| 97国产精东麻豆人妻电影| av免费观看网站| 国产不卡视频在线| 麻豆网站在线| 看看黄色一级片| 男女男精品视频站| 亚洲国产成人午夜在线一区| 在线天堂中文www视软件| 曰皮视频在线播放免费的| 午夜国产一区| 亚洲成人影院麻豆| 超碰福利在线观看| 国产调教在线| 欧美成人做性视频在线播放| 男人的天堂在线视频免费观看| 秋霞欧美在线观看| 欧美女优在线视频| 又爽又黄的午夜网站| 自拍偷拍第9页| 国产午夜大地久久| 黄色亚洲大片免费在线观看| 日本精品久久中文字幕佐佐木| 黄av在线播放| 欧美一二三区在线观看| 日韩在线观看免费高清完整版| japanese国产在线观看| 亚洲精品美女免费| 午夜视频一区二区| 欧美色图中文字幕| 中文在线不卡| 精品72久久久久中文字幕| 蜜桃在线视频| 一区二区三区的久久的视频| 中文字幕av专区| 欧美性淫爽ww久久久久无| 在线视频精品免费| 欧美亚洲国产一区二区三区va| 日本视频在线播放| 日本高清一区| 日韩a级作爱片一二三区免费观看| 激情综合网最新| 成人在线综合网| xxx亚洲日本| 久久综合视频网| 9i精品福利一区二区三区| 亚洲欧洲日产国码二区| 国产成年妇视频| 中国xxx69视频| 3d动漫精品啪啪1区2区免费| 国产精品一级久久久| 日本不卡视频一区二区| 欧美日韩成人综合在线一区二区| 欧美怡红院视频一区二区三区| 亚洲欧洲精品一区二区| 久久影院午夜论| 国产 日韩 欧美 精品| 日韩精品极品在线观看| 国产精品一区二区免费在线观看| 麻豆国产va免费精品高清在线| 久久久久久这里只有精品| 一区二区三区中文字幕在线观看| 亚洲欧美网站在线观看| 九九精品在线| 思99热精品久久只有精品| 青青草视频播放| 久久精品视频免费| 欧美xx网站| 国产小视频一区| 成人亚洲免费视频| 午夜视频在线免费观看| 久久久久国产精品麻豆ai换脸| 欧美影片第一页| 一区二区三区在线视频111| 日韩亚洲欧美综合| 国产午夜福利一区二区| 欧美大片免费| 久久精品国产99久久6| 精品电影一区二区| 日韩欧美一区二区一幕| 最近中文字幕在线免费观看| 欧美性猛交xxxx乱大交91| 成年人网站在线观看视频| 免费看成年人视频在线观看| 五月天激情四射| 欧美高清电影在线看| 亚洲+小说+欧美+激情+另类| 日韩欧美在线视频日韩欧美在线视频| melody高清在线观看| 黄色污在线观看| 男人天堂新地址| 少妇av在线| 国产无人区码熟妇毛片多| 伊人亚洲视频| 国产精品亚洲欧美一级在线| 成年人午夜视频| 中国丰满人妻videoshd| 亚洲av无码一区东京热久久| 亚洲欧美久久久久| 毛片在线播放网址| 国产一区精品| 国产原创视频在线观看| 午夜国产不卡在线观看视频| 无遮挡又爽又刺激的视频| 日韩av一二区| 经典三级在线一区| 激情五月综合色婷婷一区二区| 懂色av一区二区在线播放| 污污的视频网站在线观看| 97午夜影院| 久久99国产精品久久99大师| 欧美成人专区| 手机免费看av片| 成人av一区二区三区| 日韩电影在线观看一区| 免费观看的黄色网址| 特级西西444www大精品视频| 国产精品成人一区二区三区吃奶| 久久中文字幕二区| 一区二区91| 蜜桃成人在线| 欧美肉体xxxx裸体137大胆| 99色这里只有精品| 日韩av在线一区二区三区| 久久久久久久久久一级| 国产精品高潮呻吟AV无码| 国产亚洲情侣一区二区无| 欧美97人人模人人爽人人喊视频| aa亚洲一区一区三区| 一级特黄aaaaaa大片| 99热99热| 小泽玛利亚一区二区免费| 国产无遮挡又黄又爽又色视频| av在线官网| 色999久久久精品人人澡69| 中文字幕的av| 亚洲国产欧美另类| 91香蕉国产线在线观看| 欧洲精品一区| 亚洲一区在线不卡| gogo高清免费视频| 五月天婷婷在线观看| 国产毛片一区二区| 国产精品亲子伦av一区二区三区| 久久99国产成人小视频| 国内精品美女av在线播放| jizzjizzjizz孕妇| 亚洲第一天堂网| 久久99久久久精品欧美| 天堂在线免费观看| 欧美色成人综合| 老司机成人免费视频| 日韩av大片在线| 欧美做受高潮1| 久久亚洲免费| 丁香花在线高清完整版视频| 中文字幕精品亚洲| 6699嫩草久久久精品影院| 天堂网www在线中文天堂| 日韩欧美精品在线| 久久精品亚洲7777影院| 永久免费看片直接| 韩国理伦片久久电影网| 精品偷拍激情视频在线观看| 久久久精品国产免大香伊| 久久久久久久福利| 久久青草精品视频免费观看| 国产精品一区二区三区在线| 久久久久久久久久福利| 日韩中文在线中文网在线观看| 夜色资源网av在先锋网站观看| 黄色资源在线观看| 国户精品久久久久久久久久久不卡| 久久黄色片视频| 亚洲网站情趣视频| gogogo免费高清日本写真| 欧美日韩精品免费观看视欧美高清免费大片| 欧美日韩在线播放一区二区| 中文字幕在线日本| eeuss影院www影院入口| 欧美最顶级a∨艳星| 91精品国产91久久久久麻豆 主演|