精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

細說Singleton模式:創建、多線程與銷毀

開發 后端
本文對Singleton模式進行了一番簡略的介紹,主要參考了GOF著作中對Singleton的描述。GOF著作中對Singleton模式的描述為:保證一個class只有一個實體(Instance),并為它提供一個全局訪問點(global access point)。

GOF著作中對Singleton模式的描述為:保證一個class只有一個實體(Instance),并為它提供一個全局訪問點(global access point)。

從其描述來看,是非常簡單的,但實現該模式卻是復雜的。Singleton設計模式不存在一種所謂的“***”方案。需要根據當時的具體問題進行具體解決,下面將講述在不同環境下的解決方案。

Singleton的詳細解釋,請大家看GOF的著作《設計模式》一書。俺比較懶,是不想抄了。

1         Singleton創建

1.1      GOF Singleton

在GOF著作中對Singleton模式的實現方式如下:

  1. /*解一*/   
  2. class Singleton   
  3. {   
  4. public:   
  5. static Singleton *Instance(){                            //1   
  6. if( !m_pInstatnce) //2   
  7. m_pInstance = new Singleton;//3   
  8. return m_pInstance; //4   
  9. }   
  10. private:   
  11. static Singleton *m_pInstatnce;             //5   
  12. private:   
  13. Singleton();                                                         //6   
  14. Singleton(const Singleton&);                             //7   
  15. Singleton& operator=(const Singleton&);            //8   
  16. ~Singleton();                                                       //9   
  17. }   
  18. Singleton *Singleton:m_pInstatnce = NULL; //10   
  19.  

在上面的解決方案中,我們只在需要調用時,才產生一個Singleton的對象。這樣帶來的好處是,如果該對象產生帶來的結果很昂貴,但不經常用到時,是一種非常好的策略。但如果該Instance被頻繁調用,那么就有人覺得Instance中的判斷降低了效率(雖然只是一個判斷語句^_^),那么我們就把第5條語句該為

  1. static Singleton m_Instatnce;  

如此一來,在Instatnce直接返回&m_Instance,而不用做任何判斷,效率也高了。(是不是呢?)

這樣修改后,我們將帶來災難性的后果:

1:首先有可能編譯器這關就沒法通過,說m_Instance該外部變量無法解決(visural C++6.0)

  1. error LNK2001: unresolved external symbol "private: static class Singleton  Singleton::m_Instance" (?m_Instance@Singleton@@0V1@A)  

2:如果編譯器這關通過了就沒問題了么?答案是否定的。

***是不管Instance是否用到,該靜態變量對象在編譯器編譯時就產生了,即資源消耗是不可避免的;

第二是無法確保編譯器一定先將m_Instance初始化。所以Instance的調用有可能傳回一個尚沒構造的Singleton對象。這也意味著你無法保證任何外部對象所使用的m_Instance是一個被正確初始化的對象。

1.2      Meyers Singleton
我們如何解決這個問題呢,實際上很簡單。一種非常優雅的做法由Scott Meyers***提出,故也稱為Meyers Singleton。它依賴編譯器的神奇技巧。即函數內的static對象只在該函數***次執行時才初始化(請注意不是static常量)。

  1. /*解二*/   
  2. class Singleton   
  3. {   
  4. public:   
  5. static Singleton *Instance(){                            //1   
  6. static Singleton sInstance; //2   
  7. return &sInstance; //3   
  8. }   
  9. private:   
  10. Singleton();                                                         //4   
  11. Singleton(const Singleton&);                             //5   
  12. Singleton& operator=(const Singleton&);            //6   
  13. ~Singleton();                                                       //7   
  14. }   
  15.  

解二在Instance中定義了一個Static的Singleton對象,來解決Instance中初始化的問題,也很順利的解決了定義Static成員對象帶來的問題。

請注意,解二在VC6中不能編譯通過,將有以下的錯誤:

  1. error C2248: 'Singleton::~Singleton' : cannot access private member declared in class 'Singleton' e:\work\q\a.h(81) : see declaration of 'Singleton::~Singleton'  

產生該問題的錯誤原因是什么呢(請仔細思考^_^)

原因在于在產生static Singleton對象后,編譯器會自動產生一個銷毀函數__DestroySingleton,然后調用atexit()注冊,在程序退出時執行__DestroySingleton。但由于Singleton的析構函數是private,所以會產生訪問錯誤。(應該在以后的編譯器中修改了該BUG)

1.3      Singleton改進

讓Instance傳回引用(reference)。如果傳回指針,調用端有可能講它delete調。

1.4      Singleton注意之點

在上面的解法中,請注意對構造函數和析構函數的處理,有何好處(請自己理解,俺懶病又犯了)。

2         多線程

在解一中,如果我們運行在多線程的環境中,該方案是***的么,將會有什么后果呢?

后果就是會造成內存泄漏,并且有可能前后獲取的Singleton對象不一樣(原因請自己思考,后面有解答)。

為了解決這個問題,將解一的Instance改為如下:

  1. Singleton& Singleton::Instance(){   
  2. Lock(m_mutex);            //含義為獲取互斥量            //1   
  3. If( !m_pInstance ){                                          //2   
  4. m_pInstance = new Singleton; //3   
  5. }   
  6. UnLock(m_mutex);                                            //4   
  7. return *m_pInstance;                                     //5   
  8. }   
  9.  

此種方法將解決解一運行在多線程環境下內存泄漏的問題,但帶來的結果是,當m_mutex被鎖定時,其它試圖鎖定m_mutex的線程都將必須等等。并且每次執行鎖操作其付出的代價極大,亦即是這種方案的解決辦法并不吸引人。

那么我們將上面的代碼改為如下方式:

  1. Singleton& Singleton::Instance(){   
  2. If( !m_pInstance ){                                                      //1   
  3. Lock(m_mutex); //含義為獲取互斥量 //2   
  4. m_pInstance = new Singleton; //3   
  5. UnLock(m_mutex); //4   
  6. }   
  7. return *m_pInstance;                                                 //5   
  8. }   
  9.  

這樣修改的結果沒有問題了么?NO!!!!該方案帶來的結果同解一,原因也一樣,都將造成內存泄漏。此時“雙檢測鎖定”模式就粉墨登場了。

由Doug Schmidt和Tim Harrison提出了“雙檢測鎖定”(Double-Checked Locking)模式來解決multithread singletons問題。

  1. Singleton& Singleton::Instance(){   
  2. If( !m_pInstance ){                                                      //1   
  3. Lock(m_mutex); //含義為獲取互斥量 //2   
  4. If(!m_pInstance) //3   
  5. m_pInstance = new Singleton; //4   
  6. UnLock(m_mutex); //5   
  7. }   
  8. return *m_pInstance;                                                 //6   
  9. }  

請看上面的第三句,這句話是不是具有化腐朽為神奇的力量啊 ^_^

上面的方案就***了么。回答還是NO!!!(各位看官是否已經郁悶了啊,這不是玩我啊?請耐心點,聽我細細到來^_^)

如果在RISC機器上編譯器有可能將上面的代碼優化,在鎖定m_mutex前執行第3句。這是完全有可能的,因為***句和第3句一樣,根據代碼優化原則是可以這樣處理的。這樣一來,我們引以為自豪的“雙檢測鎖定”居然沒有起作用( L)

怎么辦?解決唄。怎么解決?簡單,我們在m_pInstance前面加一個修飾符就可以了。什么修飾符呢?……

àvolatile(簡單吧)

那么我們完整的解法如下:

  1. /*解三*/   
  2. class Singleton   
  3. {   
  4. public:   
  5. static Singleton &Instance(){                            //1   
  6. if( !m_pInstatnce){ //2   
  7. Lock(m_mutex) //3   
  8. If( !m_pInstance ) //4   
  9. m_pInstance = new Singleton;//5   
  10. UnLock(m_mutex); //6   
  11. }   
  12. return *m_pInstance; //7   
  13. }   
  14. private:   
  15. static volatitle Singleton *m_pInstatnce;            //8   
  16. private:   
  17. Singleton();                                                         //9   
  18. Singleton(const Singleton&);                             //10   
  19. Singleton& operator=(const Singleton&);            //11   
  20. ~Singleton();                                                       //12   
  21. }   
  22. Singleton *Singleton:m_pInstatnce = NULL; //13   
  23.  

3         Singleton銷毀

在這里,我們就到了Singleton最簡單也最復雜的地方了。

為什么說它簡單?我們根本可以不理睬創建的對象m_pInstance的銷毀啊。因為雖然我們一直沒有將Singleton對象刪除,但不會造成內存泄漏。為什么這樣說呢?因為只有當你分配了累積行數據并丟失了對他的所有reference是,內存泄漏才發生。而對Singleton并不屬于上面的情況,沒有累積性的東東,而且直到結束我們還有它的引用。在現代操作系統中,當一個進程結束后,將自動將該進程所有內存空間完全釋放。(可以參考《effective C++》條款10,里面講述了內存泄漏)。

但有時泄漏還是存在的,那是什么呢?就是資源泄漏。比如說如果該Singleton對象管理的是網絡連接,OS互斥量,進程通信的handles等等。這時我們就必須考慮到Singleton的銷毀了。談到銷毀,那可是一個復雜的課題(兩天三夜也說不完^_^  開玩笑的啦,大家輕松一下嘛)。

我們需要在恰當的地點,恰當的時機刪除Singleton對象,并且還要在恰當的時機創建或者重新創建Singleton對象。

在我們的“解二”中,在程序結束時會自動調用Singleton的析構函數,那么也將自動釋放所獲取的資源。在大多數情況下,它都能夠有效運作。那特殊情況是什么呢?

我們以KDL(keyboard,display,log)模型為例,其中K,D,L均使用Singleton模式。只要keyboard或者display出現異常,我們就必須調用log將其寫入日志中,否則log對象不應該創建。對后面一條,我們的Singleton創建時就可以滿足。

在前面我們已經說到,在產生一個對象時(非用new產生的對象),由編譯器自動調用了atexit(__DestroyObject)函數來實現該對象的析構操作。而C++對象析構是LIFO進行的,即先產生的對象后摧毀。

如果在一般情況下調用了log對象,然后開始銷毀對象。按照“后創建的先銷毀”原則:log對象將被銷毀,然后display對象開始銷毀。此時display在銷毀發現出現異常,于是調用log對象進行記錄。但事實上,log對象已經被銷毀,那么調用log對象將產生不可預期的后果,此問題我們稱為Dead Reference。所以前面的解決方案不能解決目前我們遇到的問題。

Andrei Alexandrescu提出了解決方案,稱為Phoenix Singleton(取自鳳凰涅磐典故)

  1. /*解四*/   
  2. class Singleton   
  3. {   
  4. public:   
  5. static Singleton &Instance(){                              
  6. if( !m_pInstatnce){   
  7. Lock(m_mutex)   
  8. If( !m_pInstance ){   
  9. if(m_destroyed)   
  10. OnDeadReference();   
  11. else   
  12. Create();   
  13. }   
  14. UnLock(m_mutex);   
  15. }   
  16. return *m_pInstance;   
  17. }   
  18. private:   
  19. static volatitle Singleton *m_pInstatnce;   
  20. static bool m_destroyed;   
  21. private:   
  22. Singleton();                                                           
  23. Singleton(const Singleton&);                               
  24. Singleton& operator=(const Singleton&);       
  25. ~Singleton(){   
  26. m_pInstance = 0;   
  27. m_destroyed = true;   
  28. }   
  29. static void Create(){   
  30. static Singleton sInstance;   
  31. m_pInstanace = &sInstance;   
  32. }   
  33. static void OnDeadReference(){   
  34. Create();   
  35. new (m_pInstance) Singleton;   
  36. atexit(KillPhoenixSingleton);   
  37. m_destroyed = false;   
  38. }   
  39. void KillPhoenixSingleton(){   
  40. m_pInstance->~Singleton();   
  41. }   
  42. }   
  43. Singleton *Singleton:m_pInstatnce = NULL;   
  44. bool m_destroyed =false;    
  45.  

請注意此處OnDeadReference()中所使用的new操作符的用法:是所謂的placement new操作,它并不分配內存,而是在某個地址上構造一個新對象。

這是解決Dead Reference方法之一。如果此時keyboard或者display對象也需要處理Dead Reference問題時,那么上面的OnDeadReference將被頻繁調用,效率將會很低。即該問題為:需要提供一種解決方案,用于處理對象的建立過程可以不按照“先創建會銷毀”的原則,而應該為其指定一個銷毀順序。

聰明的Andrei Alexandrescu提出了一個“帶壽命的Singleton”解決方案。該方案的思想是:利用atexit()的特性;在每次創建一個對象后,將該對象放入到一個鏈表中(該鏈表是按照銷毀順序排訓的),并同時調用atexit()注冊一個銷毀函數;該銷毀函數從鏈表中獲取最需要銷毀的對象進行銷毀。(懶病又犯了L。該模式的實現請各位看官自行實現,可以參考《C++設計新思維》一書,Andrei Alexandrescu著)。

各位看官,看完本篇后,是否覺得Singleton還簡單啦 :)

【編輯推薦】

  1. 有關雙檢測鎖定(DCL)和Singleton模式的問題
  2. 最簡單的設計模式學習:Singleton模式
  3. C# Singleton的使用及優缺點探討
  4. 詳解Java Singleton模式的好處
  5. Scala程序中的分號推斷和Singleton對象
責任編輯:yangsai 來源: CSDN
相關推薦

2013-05-23 15:59:00

線程池

2023-06-06 08:17:52

多線程編程Thread類

2010-03-15 17:56:23

Java多線程

2009-08-31 16:12:02

C#使用Singlet

2025-06-10 09:07:32

Go模式開發

2010-02-01 17:18:23

Python多線程環境

2009-06-29 18:00:05

Java多線程Runnable接口創建線程

2009-06-29 17:54:10

Java多線程Thread類創建線程

2021-02-25 15:58:46

C++線程編程開發技術

2009-07-09 17:30:59

Singleton模式C++ SingletJava Single

2011-11-18 10:50:25

設計模式Java線程

2025-05-12 04:00:01

2009-08-25 18:04:30

C#實現Singlet

2009-09-02 16:23:27

C# Singleto

2009-08-31 15:48:02

C# Singleto

2009-07-08 17:25:05

Java Single

2010-03-10 08:54:49

Python多線程

2022-05-20 10:20:17

Spring事務MyBatis

2024-12-27 08:11:44

Python編程模式IO

2011-07-18 16:51:51

Cocoa 單態 模式
點贊
收藏

51CTO技術棧公眾號

欧美电影免费| √天堂8在线网| 日本欧美在线观看| 日韩在线视频免费观看高清中文| 亚洲人视频在线| 在线观看三级视频| 久久久午夜电影| 成人av番号网| 国产精品第九页| av永久不卡| 精品国产成人系列| 爱情岛论坛成人| 免费av不卡在线观看| 91在线丨porny丨国产| 国产日韩欧美视频在线| 国产黄色片视频| 日韩国产一区二区三区| 欧美成人激情免费网| 免费黄色特级片| 一区二区三区伦理| 国产日韩影视精品| 91在线看www| 亚洲综合久久网| 一区二区中文| 国产亚洲人成a一在线v站| 手机av在线网站| 丝袜美腿一区| 亚洲成av人片在www色猫咪| 日本中文不卡| 无码精品在线观看| 国产乱国产乱300精品| 日韩美女视频免费在线观看| 久久久久久久久艹| 天天综合精品| 亚洲系列中文字幕| 国产制服丝袜在线| 一区二区三区免费在线看| 欧美中文字幕一区二区三区亚洲| 很污的网站在线观看| 国产视频中文字幕在线观看| 久久精品亚洲麻豆av一区二区| 国产精品一区二区你懂得| 国产精品欧美亚洲| 日本麻豆一区二区三区视频| 欧美怡红院视频一区二区三区 | www国产精品av| 粉嫩av免费一区二区三区| 一道本无吗一区| 日韩高清不卡一区| 日韩免费av在线| 欧美日韩综合一区二区三区| 国产一区91| 高清欧美性猛交xxxx黑人猛交| 国产大片免费看| 久久精品欧美一区| 久久影院在线观看| 国产日韩欧美在线观看视频| 99精品视频在线观看免费播放| 在线性视频日韩欧美| 久久久久无码精品国产sm果冻 | 久久久久久免费观看| 中文字幕一区二区三区欧美日韩 | 国产午夜在线观看| 久久久久久一级片| 日本精品一区二区三区视频| 免费在线黄色网址| 国产午夜亚洲精品理论片色戒| 麻豆传媒一区二区| 青青色在线视频| 久久久久国产精品麻豆ai换脸| 欧美韩国日本精品一区二区三区| 日本中文字幕一区二区有码在线 | 99国产精品无码| 久久精品国产99久久| 日韩亚洲国产中文字幕| 永久免费看片视频教学| 在线观看免费一区二区| 欧美激情欧美激情| 国产特黄大片aaaa毛片| 国产亚洲高清视频| 日本免费久久高清视频| 99re热视频| 黄色资源网久久资源365| 国产中文日韩欧美| 精品国自产拍在线观看| 成人美女视频在线观看18| 精品不卡一区二区三区| 青梅竹马是消防员在线| 中文字幕巨乱亚洲| 男人的天堂视频在线| 99爱在线视频| 欧美三级欧美一级| 无码国产精品一区二区高潮| 欧美理论电影在线精品| 色婷婷久久av| 久久久久久久99| 日本女人一区二区三区| 999视频在线观看| 亚洲av成人精品日韩在线播放| 国产日韩欧美一区二区三区乱码| 六月婷婷激情网| 伊人久久国产| 欧美一区二区三区免费观看视频| 国产精品无码网站| 亚洲a一区二区三区| 91极品视频在线| 91丨九色丨蝌蚪丨对白| fc2成人免费人成在线观看播放 | 亚洲精品一区二区在线看| 欧美激情综合亚洲一二区 | 天使と恶魔の榨精在线播放| 精品成人久久av| 手机在线视频一区| 一道在线中文一区二区三区| 久久电影一区二区| 在线免费观看av网址| 国产+成+人+亚洲欧洲自线| 青青草成人激情在线| 免费电影网站在线视频观看福利| 在线观看亚洲一区| 国产精品九九视频| 欧美成人直播| 亚洲永久精品大片| 91美女片黄在线观| 欧美套图亚洲一区| 亚洲一区二区美女| 九九九九九九九九| 奇米亚洲欧美| 91精品国产乱码久久久久久久久| 国产乱码精品一区二区三区精东| 久久―日本道色综合久久 | 在线欧美视频| 成人性生交大片免费看小说| 欧美女子与性| 亚洲第一主播视频| 欧美xxxx黑人| 亚洲欧洲美洲一区二区三区| 国产精品久久久久久久久借妻| 天天操天天干天天爱| 伊人开心综合网| 永久av免费在线观看| 日韩av在线播放网址| 日本中文字幕成人| 天天干天天插天天操| 亚洲综合一区在线| 亚洲av无一区二区三区久久| 天天av综合| 国产精品久久婷婷六月丁香| 亚洲精品无人区| 国产三区在线观看| 欧美区视频在线观看| 黄色av免费播放| 视频一区二区国产| 日韩av不卡播放| 日本电影欧美片| 国产丝袜一区二区三区| 亚洲欧美一区二区三区在线观看| 91啦中文在线观看| 97av视频在线观看| 国产精品嫩草影院在线看| 欧美亚洲国产精品| 色视频在线看| 色综合久久88色综合天天免费| 久久精品综合视频| 老司机精品视频网站| 欧美一区二区三区精美影视| 日韩不卡免费高清视频| 国产一区二区三区在线| 中文字幕男人天堂| 亚洲欧美中日韩| 伊人久久久久久久久| 国内自拍一区| 久久久一本精品99久久精品66 | 欧美a级成人淫片免费看| 国产精品免费视频xxxx| 免费在线毛片网站| 日韩精品一区二区在线观看| 国产午夜福利一区二区| 91年精品国产| 一区二区三区 日韩| 婷婷综合五月| 国产日韩三区| julia一区二区三区中文字幕| 日韩亚洲综合在线| 亚洲国产精品久久久久久久 | 日韩视频在线视频| 你微笑时很美电视剧整集高清不卡| 日韩女在线观看| 无遮挡的视频在线观看 | 欧洲vs亚洲vs国产| 国产精品美女久久| 在线观看小视频| 亚洲精品自在久久| 一级黄色片在线观看| 亚洲男人的天堂网| 国产老熟女伦老熟妇露脸| 久久美女性网| 伊人久久在线观看| 亚洲精品aaaaa| 成人情趣片在线观看免费| 欧美xxxx做受欧美88bbw| 国产丝袜一区二区三区免费视频| 亚洲视频一区在线播放| 亚洲一区二区黄色| 国产三级黄色片| av在线播放不卡| 看看黄色一级片| 一本一道久久综合狠狠老精东影业| 色狠狠久久av五月综合| 国产精品18hdxxxⅹ在线| 国产精品91一区| 888av在线视频| 久久精品国产v日韩v亚洲| 天天干视频在线| 91精品国产色综合久久不卡蜜臀 | 最新日本中文字幕| 美女任你摸久久| 亚洲自偷自拍熟女另类| 欧美在线三区| 一区二区在线不卡| 国产精品自拍区| 精品中文字幕人| 亚洲大奶少妇| 91网站免费观看| 欧美jizz18| 国产精品久久久久久久app| wwwww亚洲| 欧美高清激情视频| www国产在线观看 | 一区二区精品免费| 成人国产视频在线观看| 午夜精品免费看| 久久一区精品| www.avtt| 欧美日韩久久| 中文字幕一区二区三区四区五区人| 久久av免费看| 免费观看成人在线| 亚洲日本三级| 鲁丝一区鲁丝二区鲁丝三区| 国产精品毛片久久久| 91久久精品一区二区别| 免费视频观看成人| 国产欧美 在线欧美| 欧美大片高清| 国产不卡av在线免费观看| 国产高潮在线| …久久精品99久久香蕉国产| 黑森林国产精品av| 精品中文字幕在线观看| 最新黄网在线观看| 欧美激情在线有限公司| 男插女视频久久久| 久久久久久久久亚洲| 污视频在线看网站| 欧美精品国产精品日韩精品| 免费不卡av| 91sa在线看| 成人国产二区| 国产精品99导航| 91p九色成人| 成人性生交大片免费看视频直播| 未满十八勿进黄网站一区不卡| 国产日韩av在线| 国产精品日本一区二区不卡视频| 91网站在线免费观看| 国产一区二区三区视频在线| 成人91视频| 性欧美lx╳lx╳| 日韩精品欧美在线| 久久一区二区三区电影| 一级黄色录像免费看| 欧美日本一区| 两根大肉大捧一进一出好爽视频| 免费看的黄色欧美网站| 久草福利视频在线| 国产乱码精品一区二区三区av| 精品人妻无码中文字幕18禁| 97精品视频在线观看自产线路二| 91久久免费视频| 成人欧美一区二区三区白人| 免费人成在线观看| 欧美性精品220| 91国内精品视频| 精品久久久网站| 青草久久伊人| 免费成人高清视频| 美女网站在线看| 国产日韩中文字幕在线| av成人app永久免费| 免费久久久一本精品久久区| 国产精品久久久久久久| 国产一级爱c视频| 人人狠狠综合久久亚洲| 色姑娘综合天天| 国产亚洲欧洲997久久综合| 精品无码一区二区三区蜜臀| 亚洲成人一二三| 一级黄色片网站| 精品视频久久久久久| 欧美边添边摸边做边爱免费| 久久久在线视频| 免费成人高清在线视频| 国严精品久久久久久亚洲影视 | 国产精品人人人人| 欧美精品在线一区二区三区| 五月激情婷婷综合| 久久中文字幕国产| 都市激情亚洲综合| 成人动漫视频在线观看完整版 | 国产人妻人伦精品| 日韩电影在线一区二区| 久久久久亚洲av无码网站| 久久久精品2019中文字幕之3| 久久久无码精品亚洲国产| 欧美午夜精品一区| 亚洲 欧美 激情 另类| 久久6免费高清热精品| 97欧美成人| 久久久久久久免费| 欧美午夜久久| 久久精品视频在线观看免费| 国产亚洲成年网址在线观看| 日产精品久久久久久久| 欧美一区二区三区电影| avtt亚洲| 日韩美女免费观看| 亚州精品视频| 日本中文字幕亚洲| 风间由美一区二区三区在线观看| 91香蕉视频网| 欧美三级在线视频| 二区在线观看| 国产精品都在这里| 色婷婷久久久| 成 年 人 黄 色 大 片大 全| 国产.欧美.日韩| 久久无码精品丰满人妻| 欧美一区二区三区在线电影| 成黄免费在线| 国产精品极品美女粉嫩高清在线| 亚洲欧洲av| 欧洲av无码放荡人妇网站| 成人小视频在线| 久久伊人成人网| 日韩精品一区二区三区视频| av大片在线| 亚洲自拍偷拍色片视频| 久久久9色精品国产一区二区三区| 中国黄色片免费看| 国产精品国产自产拍在线| 中文字幕av第一页| 在线成人免费网站| ww久久综合久中文字幕| 日韩理论片在线观看| 日本欧美加勒比视频| 国产又黄又粗又猛又爽的| 精品视频免费看| www视频在线看| 国产精品久久九九| 99精品热视频只有精品10| 老熟妇精品一区二区三区| 欧美日韩国产精品一区二区三区四区| 五月婷婷六月丁香| 18久久久久久| 精品一区不卡| 亚洲第一区第二区第三区| 亚洲欧美电影一区二区| 亚洲av少妇一区二区在线观看| 久久久久久亚洲精品中文字幕| 米奇精品关键词| 国产免费一区二区三区视频| 国产色爱av资源综合区| 91久久国语露脸精品国产高跟| 欧美精品在线免费| 极品国产人妖chinesets亚洲人妖| 黄色国产一级视频| 久久久久久久精| 国产乱码精品一区二三区蜜臂| 久久久久久久久久久亚洲| 亚洲瘦老头同性70tv| 一区二区在线免费看| 一区二区三区在线不卡| 天堂视频中文在线| 国产精品吴梦梦| 欧美视频在线观看| 国产又粗又猛又爽视频| 欧美美女网站色| 国产伦子伦对白在线播放观看| 日韩av一区二区三区美女毛片| 国产一本一道久久香蕉| 日韩黄色一级大片| 自拍偷拍免费精品| 超碰精品在线观看| 国产高潮免费视频| 亚洲成a人在线观看| aaa日本高清在线播放免费观看| 999热视频在线观看| 日本亚洲天堂网| 国产奶水涨喷在线播放|