久久亚洲精品成人_国产精品欧美综合亚洲_亚洲va天堂va欧美ⅴa在线_91色视频在线观看_久久影院亚洲_一级黄色片播放_日韩av在线一区_精品一区二区在线看_老头吃奶性行交视频_日韩免费高清视频_天天操天天爽天天干_日本欧美在线视频

首頁 > 編程 > C++ > 正文

C++智能指針實例詳解

2020-05-23 14:24:15
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++智能指針實例詳解,需要的朋友可以參考下
 
 

本文通過實例詳細闡述了C++關于智能指針的概念及用法,有助于讀者加深對智能指針的理解。詳情如下:

一、簡介

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

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

1、總括

對于編譯器來說,智能指針實際上是一個棧對象,并非指針類型,在棧對象生命期即將結束時,智能指針通過析構函數釋放有它管理的堆內存所有智能指針都重載了“operator->”操作符,直接返回對象的引用,用以操作對象。訪問智能指針原來的方法則使用“.”操作符。

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

智能指針包含了 reset() 方法,如果不傳遞參數(或者傳遞 NULL),則智能指針會釋放當前管理的內存。如果傳遞一個對象,則智能指針會釋放當前對象,來管理新傳入的對象。
我們編寫一個測試類來輔助分析:

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,當然在 namespace std 中,包含頭文件 #include<memory> 便可以使用。std::auto_ptr 能夠方便的管理單個堆內存對象。

我們從代碼開始分析:

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

執行結果為:

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

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

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

最終如上代碼導致崩潰,如上代碼時絕對符合 C++ 編程思想的,居然崩潰了,跟進 std::auto_ptr 的源碼后,我們看到,罪魁禍首是“my_memory2 = my_memory”,這行代碼,my_memory2 完全奪取了 my_memory 的內存管理所有權,導致 my_memory 懸空,最后使用時導致崩潰。

所以,使用 std::auto_ptr 時,絕對不能使用“operator=”操作符。作為一個庫,不允許用戶使用,確沒有明確拒絕,多少會覺得有點出乎預料。
 
看完 std::auto_ptr 好景不長的第一個例子后,讓我們再來看一個:

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

執行結果為:

Simple: 1

看到什么異常了嗎?我們創建出來的對象沒有被析構,沒有輸出“~Simple: 1”,導致內存泄露。當我們不想讓 my_memory 繼續生存下去,我們調用 release() 函數釋放內存,結果卻導致內存泄露(在內存受限系統中,如果my_memory占用太多內存,我們會考慮在使用完成后,立刻歸還,而不是等到 my_memory 結束生命期后才歸還)。

正確的代碼應該為:

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 內部管理的內存 }}

原來 std::auto_ptr 的 release() 函數只是讓出內存所有權,這顯然也不符合 C++ 編程思想。
總結:std::auto_ptr 可用來管理單個對象的對內存,但是,請注意如下幾點:

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

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

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 沒有 release 函數  std::auto_ptr<Simple> my_memory2;  my_memory2 = my_memory;    // 編譯 error: scoped_ptr 沒有重載 operator=,不會導致所有權轉移 }}

首先,我們可以看到,boost::scoped_ptr 也可以像 auto_ptr 一樣正常使用。但其沒有 release() 函數,不會導致先前的內存泄露問題。其次,由于 boost::scoped_ptr 是獨享所有權的,所以明確拒絕用戶寫“my_memory2 = my_memory”之類的語句,可以緩解 std::auto_ptr 幾個惱人的問題。
    由于 boost::scoped_ptr 獨享所有權,當我們真真需要復制智能指針時,需求便滿足不了了,如此我們再引入一個智能指針,專門用于處理復制,參數傳遞的情況,這便是如下的 boost::shared_ptr。
 
4、boost::shared_ptr

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

void TestSharedPtr(boost::shared_ptr<Simple> memory) { // 注意:無需使用 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 也沒有 release 函數}

執行結果為:

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

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

boost::scoped_array 屬于 boost 庫,定義在 namespace boost 中,包含頭文件 #include<boost/smart_ptr.hpp> 便可以使用。
    boost::scoped_array 便是用于管理動態數組的。跟 boost::scoped_ptr 一樣,也是獨享所有權的。

我們還是從代碼開始分析:

void TestScopedArray() {   boost::scoped_array<Simple> my_memory(new Simple[2]); // 使用內存數組來初始化   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 沒有重載 operator*    my_memory[0].release();               // 同上,沒有 release 函數    boost::scoped_array<Simple> my_memory2;    my_memory2 = my_memory;               // 編譯 error,同上,沒有重載 operator=   }  }

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

下面肯定應該講 boost::shared_array 了,一個用引用計數解決復制、參數傳遞的智能指針類。
 
6、boost::shared_array
boost::shared_array 屬于 boost 庫,定義在 namespace boost 中,包含頭文件 #include<boost/smart_ptr.hpp> 便可以使用。

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

我們還是從代碼開始分析:

void TestSharedArray(boost::shared_array<Simple> memory) { // 注意:無需使用 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 沒有重載 operator* } std::cout << "TestSharedArray2 UseCount: " << my_memory.use_count() << std::endl; TestSharedArray(my_memory); std::cout << "TestSharedArray2 UseCount: " << my_memory.use_count() << std::endl;}

執行結果為:

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

跟 boost::shared_ptr 一樣,使用了引用計數,可以復制,通過參數來傳遞。
 
至此,我們講過的智能指針有 std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array。這幾個智能指針已經基本夠我們使用了,90% 的使用過標準智能指針的代碼就這 5 種。可如下還有兩種智能指針,它們肯定有用,但有什么用處呢,一起看看吧。
 
7、boost::weak_ptr

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

  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;}

    執行結果為:

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

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

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

如上講了這么多智能指針,有必要對這些智能指針做個總結:

1、在可以使用 boost 庫的場合下,拒絕使用 std::auto_ptr,因為其不僅不符合 C++ 編程思想,而且極容易出錯。
2、在確定對象無需共享的情況下,使用 boost::scoped_ptr(當然動態數組使用 boost::scoped_array)。
3、在對象需要共享的情況下,使用 boost::shared_ptr(當然動態數組使用 boost::shared_array)。
4、在需要訪問 boost::shared_ptr 對象,而又不想改變其引用計數的情況下,使用 boost::weak_ptr,一般常用于軟件框架設計中。
5、最后一點,也是要求最苛刻一點:在你的代碼中,不要出現 delete 關鍵字(或 C 語言的 free 函數),因為可以用智能指針去管理。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
美女av免费观看| 亚洲三级 欧美三级| 国产精品激情av电影在线观看| 黄色国产在线观看| 日本一区二区三级电影在线观看| 日日狠狠久久偷偷四色综合免费| 美女喷白浆视频| 不卡在线观看av| 国产精品自拍视频| 中文字幕男人天堂| 国产一区二区成人| 日韩 欧美 高清| 麻豆久久一区二区| 国产男女猛烈无遮挡91| 日韩精品视频播放| 精品国产一区久久| 亚洲精品成人无码熟妇在线| 精品女同一区二区三区在线播放| 在线观看精品视频| 91视频你懂的| 久久久一二三四| 国内成人精品2018免费看| 91精品久久久久久综合乱菊 | 亚洲精品一区中文字幕乱码| 欧产日产国产精品98| 国产精品水嫩水嫩| 亚洲午夜精品网| 性欧美精品一区二区三区在线播放| 天堂网在线播放| 亚洲精品97久久| 丰满少妇xbxb毛片日本| 色婷婷精品大在线视频 | 精品视频免费在线| 国产高潮免费视频| 疯狂做受xxxx高潮欧美日本| 一级黄色特级片| 91福利在线播放| 特种兵之深入敌后| 亚洲成人国产精品| 欧美人妻一区二区三区| 日韩电影中文字幕av| 欧美日韩精品在线观看视频| 色偷偷av亚洲男人的天堂| 欧美亚韩一区二区三区| 欧美激情视频一区二区三区不卡| 精品人妻无码一区二区| 亚洲一线二线三线久久久| 在线视频91| 日本韩国欧美三级| 日本理论中文字幕| 欧美精品18videosex性欧美| 午夜精品久久久久久久99老熟妇| 91久久精品美女| 26uuu亚洲| 欧美一级片免费播放| 午夜精品久久久久久久久| 99精品视频免费版的特色功能| 亚洲精选一二三| 2一3sex性hd| 精品捆绑美女sm三区| 午夜精品久久久久久久久久久久久蜜桃| 精品一区二区三区久久| 国产精选久久久久久| 国产精品自在自线| 亚洲另类激情图| 国产裸体无遮挡| 亚洲精品一区二区三区蜜桃久| 国产精品久99| 国产精品 欧美激情| 国产裸体写真av一区二区| av成人免费在线观看| www.四虎精品| 97久久国产精品| 欧美专区在线观看一区| 色av中文字幕一区| 老司机深夜福利网站| 婷婷久久综合九色综合伊人色| 午夜久久久久久久久久久| 国产亚洲一区二区三区在线观看 | 8x8x8国产精品| ijzzijzzij亚洲大全| 欧美 日韩 国产 精品| 久久国产一区二区三区| 国产乱人乱偷精品视频| 亚洲成成品网站| 五月天婷婷在线观看视频| 日韩电影网在线| 91av网站在线播放| 免费在线观看亚洲| 久久精品男人天堂| 中文字幕视频网| 欧美成年人在线观看| 久久久久国产精品午夜一区| 欧美日韩视频在线一区二区观看视频| 亚洲国产精品成人综合| 永久av免费在线观看| 亚洲欧美在线免费观看| 色一情一乱一乱一区91av| 97成人在线免费视频| 国产亚洲视频中文字幕视频| 日韩高清一区二区| 天天干天天操天天玩| 欧美激情精品久久久| 国产精品狼人久久影院观看方式| 久久久久久久久久99| 日本一区二区三区四区高清视频| 欧美少妇bbb| 成人高清免费观看| 国产不卡av在线免费观看| 国产成人精品av在线观| 奇米亚洲午夜久久精品| 久久婷婷激情| 精品久久久噜噜噜噜久久图片 | 九色综合日本| 91精品在线麻豆| 韩国精品一区二区| 中文字幕天堂网| 国产成人午夜视频网址| 色妹子一区二区| 日本不卡一区二区三区高清视频| 色欲av无码一区二区三区| 国产在线资源一区| 亚洲欧洲日韩国产| 在线视频欧美区| 高潮一区二区三区乱码| 五月天婷婷影视| 成人黄色短视频在线观看| 亚洲精品国产成人久久av盗摄| 美乳视频一区二区| 欧美日韩成人高清| 国产成人免费视频网站高清观看视频 | 国产一区二区视频在线免费观看| 亚洲国产私拍精品国模在线观看| 国产精品护士白丝一区av| 五月婷在线视频| 国产精品久久久视频| 相泽南亚洲一区二区在线播放 | 在线观看网站黄| 国产在线视频91| 久久精品国产av一区二区三区| 亚洲欧美日韩精品久久久| 亚洲精品久久久久国产| 成人中文字幕合集| 五月天激情四射| 99国产精品免费视频| 国产精品久久九九| 国产一区二区三区丝袜| 国产精品久久久久天堂| 天堂成人国产精品一区| 内射一区二区三区| 色婷婷狠狠18禁久久| 日韩高清专区| 亚洲综合色激情五月| 欧美激情区在线播放| 精品国产在天天线2019| 欧美日韩国产片| 一区二区三区四区不卡在线 | 日韩女优在线播放| 日本黄视频在线观看| 免费成人深夜夜行p站| 东北少妇不带套对白| 国产精品无码专区在线观看| 亚洲人成在线一二| 欧美性猛交xxxx久久久| 日本一区二区三区高清不卡| 黄色小说综合网站| 色呦呦免费观看| 99在线精品视频免费观看软件 | 亚洲高清免费观看| 国产成人免费在线观看不卡| 超碰在线观看av| 国产日产精品一区二区三区四区| 亚洲图片制服诱惑| 亚洲国产欧美一区| 精品亚洲va在线va天堂资源站| 欧美日韩一区视频| 91精品国产高清一区二区三区| 狠狠操狠狠色综合网| 一本久道中文字幕精品亚洲嫩| 一区二区三区鲁丝不卡| 91啪亚洲精品| 久久影院视频免费| 99麻豆久久久国产精品免费优播| 国产剧情一区二区| 国产成人自拍高清视频在线免费播放| 99re成人在线| 一区二区三区鲁丝不卡| 精品国产成人在线| 精品免费99久久| 美日韩在线视频| 欧美最顶级的aⅴ艳星| 亚洲精品成人a8198a| 亚洲黄色小视频在线观看| 日韩影院一区二区| 久久se精品一区精品二区| 国产精品久久久久久久久图文区 | 丁香啪啪综合成人亚洲| 欧美黄色片在线观看| 亚洲最大福利网站| 天天夜碰日日摸日日澡性色av| 精品久久久久久中文字幕人妻最新| 国产伦精品一区二区三区视频网站| 婷婷视频在线观看| 亚洲男人天堂av网| 久久久久九九九九| 亚洲中文字幕无码专区| 91香蕉视频导航| 国产精品免费人成网站酒店| 日本免费网站在线观看| 自拍视频在线观看一区二区| 亚洲国产精品小视频| 91香蕉亚洲精品| 五月丁香综合缴情六月小说| 四虎影院中文字幕| 国产一区二区三区不卡在线观看| 在线免费观看视频一区| 国产成人一区二区| 日韩大尺度视频| 国产成人精品免费看| 日韩中文字幕在线视频播放| 亚洲欧美日韩高清| 女同激情久久av久久| 国产欧美日韩成人| 欧美日韩精品在线视频| 国产成人精品一区二区| 男人添女人荫蒂国产| 奇米一区二区三区| 色一区av在线| 国产免费人做人爱午夜视频| 国产99视频在线| 日韩女优视频免费观看| 一级一片免费播放| 好吊色视频一区二区| 国产一区二区黑人欧美xxxx| 国产3p在线播放| 中文字幕欧美人妻精品一区蜜臀| 国产视频视频一区| 8050国产精品久久久久久| 538任你躁在线精品免费| 韩国成人精品a∨在线观看| 亚洲男人av在线| 男女av免费观看| 国产.欧美.日韩| 久久久午夜视频| 久久久香蕉视频| 日韩av网站导航| 亚洲成人激情小说| 亚洲不卡在线观看| 性一交一乱一伧国产女士spa| 欧美一级视频免费| 日韩综合中文字幕| 少妇高潮惨叫久久久久| 天天av天天翘天天综合网色鬼国产| 欧美国产综合视频| 国产视频第二页| 在线免费观看羞羞视频一区二区| aaaaa一级片| 777xxx欧美| 无码 人妻 在线 视频| 欧洲精品中文字幕| 欧美h片在线观看| 亚洲国产精品电影| 香蕉视频黄色在线观看| 欧美丝袜一区二区三区| 亚洲xxx在线观看| 亚洲国产婷婷综合在线精品| 日韩视频在线视频| 精品国产精品三级精品av网址| 久久综合伊人77777麻豆最新章节| 亚洲高清中文字幕| 野外做受又硬又粗又大视频√| 国产中文字幕一区| 久久伦理网站| 久久精品男人天堂av| 久久精品在线免费视频| 一区二区欧美视频| 亚洲中文字幕无码不卡电影| 国产无套内射又大又猛又粗又爽 | 九九热在线视频播放| 97久久精品人人澡人人爽缅北| 欧美在线观看不卡| 久久香蕉国产线看观看av| 欧美一级高潮片| 国产成人精品久久二区二区91| 午夜精品久久久久久久99老熟妇 | 久久永久免费视频| 欧美激情一二三| 国产视频在线一区| 亚洲综合日韩中文字幕v在线| 欧美一级一区二区三区| 国产精品久久网| 精品一区二区三区久久| 伊人婷婷久久| 欧美日韩中文字幕日韩欧美| 一级黄色片日本| 国产精品久久久久久久久影视| 久久精品国内一区二区三区| 制服诱惑一区| 无吗不卡中文字幕| 久久老司机精品视频| 国产精品视频99| 久久色.com| 极品久久久久久| 国产精品入口免费| 亚洲伊人伊色伊影伊综合网| 艳妇乳肉豪妇荡乳av无码福利 | 在线中文字日产幕| 中文字幕日韩欧美在线| 天天操天天干天天操| 欧美性猛交内射兽交老熟妇| 亚洲精品99久久久久| 国产精品主播一区二区| 欧美一级片免费播放| 国产午夜精品全部视频在线播放| 九一九一国产精品| 扒开jk护士狂揉免费| 亚洲五月六月| 伊人亚洲福利一区二区三区| 日本欧美一区二区三区乱码| 亚洲制服在线观看| 国产亚洲精品久久久| 麻豆精品视频在线观看视频| 北岛玲一区二区| av日韩中文字幕| 国产亚洲在线播放| 日本精品一级二级| 久久看片网站| 性少妇xx生活| www.好吊操| 日韩av免费在线播放| 岛国视频午夜一区免费在线观看| 国产成人自拍偷拍| 亚洲色图欧美自拍| 综合色婷婷一区二区亚洲欧美国产| 日韩中文字幕在线免费观看| 国产欧美日韩综合| 岛国av中文字幕| 免费一级特黄毛片| 欧美一级片一区| 欧美一区二区三区不卡| 国产喷白浆一区二区三区| 日韩av二区在线播放| 最近日韩免费视频| 成人在线观看高清| 欧美日韩中文在线视频| 国产成人精品视频在线观看| 欧美偷拍一区二区| 中文字幕一区在线观看| 成人无码一区二区三区| 免费在线不卡视频| 久草手机在线观看| 亚洲色图 激情小说| 无码精品国产一区二区三区免费| 亚洲一区免费网站| 欧美一区二区三区图| 4438x亚洲最大成人网| 在线精品视频免费观看| 欧美日韩一区二区在线视频| 国产性做久久久久久| 免费av成人在线| 国产免费视频一区二区三区| 国产一级淫片a| 潘金莲一级黄色片| 久久夜靖品2区| 青青青视频在线免费观看| 欧美日韩在线观看不卡| 国产精品久久中文字幕| 精品在线视频一区二区| 欧美一级高清免费| 国内精久久久久久久久久人| 鬼打鬼之黄金道士1992林正英| 成人黄色免费片| 欧美一级片久久久久久久| 国产极品jizzhd欧美| 欧美福利小视频| 2019精品视频| 成人黄视频免费| 成人免费看片视频| 国产精品99导航| 国产在线高清精品| 欧美日韩亚洲在线 | 另类小说一区二区三区| 国产成人无遮挡在线视频| 亚洲欧洲99久久| 一本高清dvd不卡在线观看| 在线成人高清不卡| 青青草激情视频| 偷偷操不一样的久久| 亚洲欧美日韩一区二区三区四区| 香蕉视频国产在线| 成人性生交大片免费看中文网站| 国产aⅴ综合色| 久久综合久久综合亚洲| 国产精品久久久久永久免费观看| 有坂深雪av一区二区精品| 欧美日韩国产首页| 97视频在线观看视频免费视频 | 91久久国产综合久久蜜月精品 | 美女任你摸久久| 色偷偷久久人人79超碰人人澡| 欧美日韩一区 二区 三区 久久精品| 欧美日韩日本视频| 精品成人免费观看| 2018国产精品视频| 精品国产一区二区三| 色男人天堂av| 三级网站在线播放| 久久综合影音| 中文字幕一区在线观看视频| 欧美日韩dvd在线观看|