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

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

C++中的RAII機制詳解

2020-05-23 14:21:41
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++中的RAII機制詳解,RAII是Resource Acquisition Is Initialization的簡稱,是C++語言的一種管理資源、避免泄漏的慣用法,需要的朋友可以參考下
 
 

前言

在寫C++設(shè)計模式——單例模式的時候,在寫到實例銷毀時,設(shè)計的GC類是很巧妙的,而這一巧妙的設(shè)計就是根據(jù)當(dāng)對象的生命周期結(jié)束時會自動調(diào)用其析構(gòu)函數(shù)的,而這一巧妙的設(shè)計也是有專業(yè)的名詞的——RAII。那以下將圍繞RAII,全面的講解RAII的相關(guān)知識。

什么是RAII?

RAII是Resource Acquisition Is Initialization的簡稱,是C++語言的一種管理資源、避免泄漏的慣用法。利用的就是C++構(gòu)造的對象最終會被銷毀的原則。RAII的做法是使用一個對象,在其構(gòu)造時獲取對應(yīng)的資源,在對象生命期內(nèi)控制對資源的訪問,使之始終保持有效,最后在對象析構(gòu)的時候,釋放構(gòu)造時獲取的資源。

為什么要使用RAII?

上面說到RAII是用來管理資源、避免資源泄漏的方法。那么,用了這么久了,也寫了這么多程序了,口頭上經(jīng)常會說資源,那么資源是如何定義的?在計算機系統(tǒng)中,資源是數(shù)量有限且對系統(tǒng)正常運行具有一定作用的元素。比如:網(wǎng)絡(luò)套接字、互斥鎖、文件句柄和內(nèi)存等等,它們屬于系統(tǒng)資源。由于系統(tǒng)的資源是有限的,就好比自然界的石油,鐵礦一樣,不是取之不盡,用之不竭的,所以,我們在編程使用系統(tǒng)資源時,都必須遵循一個步驟:

1.申請資源;
2.使用資源;
3.釋放資源。

第一步和第二步缺一不可,因為資源必須要申請才能使用的,使用完成以后,必須要釋放,如果不釋放的話,就會造成資源泄漏。

一個最簡單的例子:

 

復(fù)制代碼代碼如下:

#include <iostream> 
 
using namespace std; 
 
int main() 
 

    int *testArray = new int [10]; 
    // Here, you can use the array 
    delete [] testArray; 
    testArray = NULL ; 
    return 0; 
}

 

我們使用new開辟的內(nèi)存資源,如果我們不進行釋放的話,就會造成內(nèi)存泄漏。所以,在編程的時候,new和delete操作總是匹配操作的。如果總是申請資源而不釋放資源,最終會導(dǎo)致資源全部被占用而沒有資源可用的場景。但是,在實際的編程中,我們總是會各種不小心的就把釋放操作忘了,就是編程的老手,在幾千行代碼,幾萬行中代碼中,也會犯這種低級的錯誤。

再來一個例子:

復(fù)制代碼代碼如下:

#include <iostream> 
using namespace std; 
 
bool OperationA(); 
bool OperationB(); 
 
int main() 

    int *testArray = new int [10]; 
 
    // Here, you can use the array 
    if (!OperationA()) 
    { 
        // If the operation A failed, we should delete the memory 
        delete [] testArray; 
        testArray = NULL ; 
        return 0; 
    } 
 
    if (!OperationB()) 
    { 
        // If the operation A failed, we should delete the memory 
        delete [] testArray; 
        testArray = NULL ; 
        return 0; 
    } 
 
    // All the operation succeed, delete the memory 
    delete [] testArray; 
    testArray = NULL ; 
    return 0; 

 
bool OperationA() 
 

    // Do some operation, if the operate succeed, then return true, else return false 
    return false ; 

 
bool OperationB() 
 

    // Do some operation, if the operate succeed, then return true, else return false 
    return true ; 
}

 

上述這個例子的模型,在實際中是經(jīng)常使用的,我們不能期待每個操作都是成功返回的,所以,每一個操作,我們需要做出判斷,上述例子中,當(dāng)操作失敗時,然后,釋放內(nèi)存,返回程序。上述的代碼,極度臃腫,效率下降,更可怕的是,程序的可理解性和可維護性明顯降低了,當(dāng)操作增多時,處理資源釋放的代碼就會越來越多,越來越亂。如果某一個操作發(fā)生了異常而導(dǎo)致釋放資源的語句沒有被調(diào)用,怎么辦?這個時候,RAII機制就可以派上用場了。

如何使用RAII?

當(dāng)我們在一個函數(shù)內(nèi)部使用局部變量,當(dāng)退出了這個局部變量的作用域時,這個變量也就別銷毀了;當(dāng)這個變量是類對象時,這個時候,就會自動調(diào)用這個類的析構(gòu)函數(shù),而這一切都是自動發(fā)生的,不要程序員顯示的去調(diào)用完成。這個也太好了,RAII就是這樣去完成的。由于系統(tǒng)的資源不具有自動釋放的功能,而C++中的類具有自動調(diào)用析構(gòu)函數(shù)的功能。如果把資源用類進行封裝起來,對資源操作都封裝在類的內(nèi)部,在析構(gòu)函數(shù)中進行釋放資源。當(dāng)定義的局部變量的生命結(jié)束時,它的析構(gòu)函數(shù)就會自動的被調(diào)用,如此,就不用程序員顯示的去調(diào)用釋放資源的操作了?,F(xiàn)在,我們就用RAII機制來完成上面的例子。代碼如下:

 

復(fù)制代碼代碼如下:

#include <iostream> 
using namespace std; 
 
class ArrayOperation 

public : 
    ArrayOperation() 
    { 
        m_Array = new int [10]; 
    } 
 
    void InitArray() 
    { 
        for (int i = 0; i < 10; ++i) 
        { 
            *(m_Array + i) = i; 
        } 
    } 
 
    void ShowArray() 
    { 
        for (int i = 0; i <10; ++i) 
        { 
            cout<<m_Array[i]<<endl; 
        } 
    } 
 
    ~ArrayOperation() 
    { 
        cout<< "~ArrayOperation is called" <<endl; 
        if (m_Array != NULL ) 
        { 
            delete[] m_Array;  // 非常感謝益可達非常犀利的review,詳細可以參加益可達在本文的評論 2014.04.13
            m_Array = NULL ; 
        } 
    } 
 
private : 
    int *m_Array; 
}; 
 
bool OperationA(); 
bool OperationB(); 
 
int main() 

    ArrayOperation arrayOp; 
    arrayOp.InitArray(); 
    arrayOp.ShowArray(); 
    return 0;
}

 

上面這個例子沒有多大的實際意義,只是為了說明RAII的機制問題。下面說一個具有實際意義的例子:

 

復(fù)制代碼代碼如下:

/*
** FileName     : RAII
** Author       : Jelly Young
** Date         : 2013/11/24
** Description  : More information, please go to http://www.49028c.com
*/
 
#include <iostream>
#include <windows.h>
#include <process.h>
 
using namespace std;
 
CRITICAL_SECTION cs;
int gGlobal = 0;
 
class MyLock
{
public:
    MyLock()
    {
        EnterCriticalSection(&cs);
    }
 
    ~MyLock()
    {
        LeaveCriticalSection(&cs);
    }
 
private:
    MyLock( const MyLock &);
    MyLock operator =(const MyLock &);
};
 
void DoComplex(MyLock &lock ) // 非常感謝益可達犀利的review 2014.04.13
{
}
 
unsigned int __stdcall ThreadFun(PVOID pv) 
{
    MyLock lock;
    int *para = (int *) pv;
 
    // I need the lock to do some complex thing
    DoComplex(lock);
 
    for (int i = 0; i < 10; ++i)
    {
        ++gGlobal;
        cout<< "Thread " <<*para<<endl;
        cout<<gGlobal<<endl;
    }
    return 0;
}
 
int main()
{
    InitializeCriticalSection(&cs);
 
    int thread1, thread2;
    thread1 = 1;
    thread2 = 2;
 
    HANDLE handle[2];
    handle[0] = ( HANDLE )_beginthreadex(NULL , 0, ThreadFun, ( void *)&thread1, 0, NULL );
    handle[1] = ( HANDLE )_beginthreadex(NULL , 0, ThreadFun, ( void *)&thread2, 0, NULL );
    WaitForMultipleObjects(2, handle, TRUE , INFINITE );
    return 0;
}

 

這個例子可以說是實際項目的一個模型,當(dāng)多個進程訪問臨界變量時,為了不出現(xiàn)錯誤的情況,需要對臨界變量進行加鎖;上面的例子就是使用的Windows的臨界區(qū)域?qū)崿F(xiàn)的加鎖。但是,在使用CRITICAL_SECTION時,EnterCriticalSection和LeaveCriticalSection必須成對使用,很多時候,經(jīng)常會忘了調(diào)用LeaveCriticalSection,此時就會發(fā)生死鎖的現(xiàn)象。當(dāng)我將對CRITICAL_SECTION的訪問封裝到MyLock類中時,之后,我只需要定義一個MyLock變量,而不必手動的去顯示調(diào)用LeaveCriticalSection函數(shù)。

上述的兩個例子都是RAII機制的應(yīng)用,理解了上面的例子,就應(yīng)該能理解了RAII機制的使用了。

使用RAII的陷阱

在使用RAII時,有些問題是需要特別注意的。容我慢慢道來。

先舉個例子:

 

復(fù)制代碼代碼如下:

#include <iostream>
#include <windows.h>
#include <process.h>
 
using namespace std;
 
CRITICAL_SECTION cs;
int gGlobal = 0;
 
class MyLock
{
public:
    MyLock()
    {
        EnterCriticalSection(&cs);
    }
 
    ~MyLock()
    {
        LeaveCriticalSection(&cs);
    }
 
private:
    //MyLock(const MyLock &);
    MyLock operator =(const MyLock &);
};
 
void DoComplex(MyLock lock)
{
}
 
unsigned int __stdcall ThreadFun(PVOID pv)  
{
    MyLock lock;
    int *para = (int *) pv;
 
    // I need the lock to do some complex thing
    DoComplex(lock);
 
    for (int i = 0; i < 10; ++i)
    {
        ++gGlobal;
        cout<< "Thread " <<*para<<endl;
        cout<<gGlobal<<endl;
    }
    return 0;
}
 
int main()
{
    InitializeCriticalSection(&cs);
 
    int thread1, thread2;
    thread1 = 1;
    thread2 = 2;
 
    HANDLE handle[2];
    handle[0] = ( HANDLE )_beginthreadex(NULL , 0, ThreadFun, ( void*)&thread1, 0, NULL );
    handle[1] = ( HANDLE )_beginthreadex(NULL , 0, ThreadFun, ( void*)&thread2, 0, NULL );
    WaitForMultipleObjects(2, handle, TRUE , INFINITE );
    return 0;
}

 

這個例子是在上個例子上的基礎(chǔ)上進行修改的。添加了一個DoComplex函數(shù),在線程中調(diào)用該函數(shù),該函數(shù)很普通,但是,該函數(shù)的參數(shù)就是我們封裝的類。你運行該代碼,就會發(fā)現(xiàn),加入了該函數(shù),對gGlobal全局變量的訪問整個就亂了。你有么有想過,這是為什么呢?網(wǎng)上很多講RAII的文章,都只是說了這個問題,但是沒有說為什么,在這里,我好好的分析一下這里。

由于DoComplex函數(shù)的參數(shù)使用的傳值,此時就會發(fā)生值的復(fù)制,會調(diào)用類的復(fù)制構(gòu)造函數(shù),生成一個臨時的對象,由于MyLock沒有實現(xiàn)復(fù)制構(gòu)造函數(shù),所以就是使用的默認復(fù)制構(gòu)造函數(shù),然后在DoComplex中使用這個臨時變量。當(dāng)調(diào)用完成以后,這個臨時變量的析構(gòu)函數(shù)就會被調(diào)用,由于在析構(gòu)函數(shù)中調(diào)用了LeaveCriticalSection,導(dǎo)致了提前離開了CRITICAL_SECTION,從而造成對gGlobal變量訪問沖突問題,如果在MyLock類中添加以下代碼,程序就又能正確運行:

復(fù)制代碼代碼如下:

MyLock( const MyLock & temp ) 

    EnterCriticalSection(&cs); 
}

 

這是因為CRITICAL_SECTION 允許多次EnterCriticalSection,但是,LeaveCriticalSection必須和EnterCriticalSection匹配才能不出現(xiàn)死鎖的現(xiàn)象。

為了避免掉進了這個陷阱,同時考慮到封裝的是資源,由于資源很多時候是不具備拷貝語義的,所以,在實際實現(xiàn)過程中,MyLock類應(yīng)該如下:

 

復(fù)制代碼代碼如下:

class MyLock
{
public:
    MyLock()
    {
        EnterCriticalSection(&cs);
    }
 
    ~MyLock()
    {
        LeaveCriticalSection(&cs);
    }
 
private:
    MyLock(const MyLock &);
    MyLock operator =(const MyLock &);
};

 

這樣就防止了背后的資源復(fù)制過程,讓資源的一切操作都在自己的控制當(dāng)中。如果要知道復(fù)制構(gòu)造函數(shù)和賦值操作符的調(diào)用,可以好好的閱讀一下《深度探索C++對象模型這本書》。

總結(jié)

說了這么多了,RAII的本質(zhì)內(nèi)容是用對象代表資源,把管理資源的任務(wù)轉(zhuǎn)化為管理對象的任務(wù),將資源的獲取和釋放與對象的構(gòu)造和析構(gòu)對應(yīng)起來,從而確保在對象的生存期內(nèi)資源始終有效,對象銷毀時資源一定會被釋放。說白了,就是擁有了對象,就擁有了資源,對象在,資源則在。所以,RAII機制是進行資源管理的有力武器,C++程序員依靠RAII寫出的代碼不僅簡潔優(yōu)雅,而且做到了異常安全。在以后的編程實際中,可以使用RAII機制,讓自己的代碼更漂亮。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲最大激情中文字幕| 欧美精品一区二区不卡| 欧美日韩另类在线| 8090成年在线看片午夜| 中文字幕av一区二区三区免费看| 在线观看欧美日韩| 91成人国产综合久久精品| 国产欧美日韩综合一区在线播放| 国产麻豆一区二区三区| 久久精品亚洲无码| 亚洲视频一二| 久久不见久久见免费视频7| 日韩免费观看高清| 欧美性淫爽ww久久久久无| 国产福利在线观看视频| 欧美在线一级| 久久久精品蜜桃| 国产精品成人a在线观看| 一个人在线观看免费视频www| 欧美日韩在线播| 秘密基地免费观看完整版中文| 欧美视频精品全部免费观看| 高清shemale亚洲人妖| 国产成人免费av| 国产美女精品视频免费播放软件| 97精品国产97久久久久久免费| 天天干天天干天天干| 欧美 亚欧 日韩视频在线| 久久露脸国产精品| 91视频免费观看| 国产成人无码aa精品一区| 天天堂资源网在线观看免费视频| 色老板视频在线观看| 国产精品户外野外| 国产成人无码一区二区在线播放| 欧美综合一区二区三区| 欧美一区二区视频网站| 亚洲免费精品视频| 日韩在线免费高清视频| 国产电影一区二区三区爱妃记| 在线小视频你懂的| 国产一区二区欧美日韩| 日韩综合在线视频| 日韩免费一二三区| 97碰碰碰免费色视频| 国产精品23p| 国产又粗又长又爽| 欧美性受xxxx黑人xyx性爽| 欧美精品一区二区三区视频| 亚洲国产高清一区二区三区| 亚洲 国产 日韩 欧美| 成人精品一区二区三区| 日本久久综合| 亚洲国产一区二区三区高清| 欧美四级剧情无删版影片| 国产麻豆高清视频在线第一页| 国产精品福利一区二区三区| 伊人精品久久| 亚洲精品天堂在线观看| 伊人中文字幕在线| 果冻天美麻豆一区二区国产| 91国产视频在线| 天堂中文资源在线| 亚洲国产精品成人天堂| 99re这里只有精品在线| 国产午夜在线观看| 日本黄色一区二区三区| 欧美最顶级的aⅴ艳星| 久久99精品久久久久久青青91| 日韩欧美一中文字暮专区| www.av一区视频| 免费在线一区二区| 亚洲高清黄色| 欧美在线免费一级片| 亚洲国产午夜伦理片大全在线观看网站| 蜜桃传媒一区二区亚洲| 日本韩国精品一区二区| 久久久久久久99| 一本一道久久a久久精品蜜桃| 国产精品99久久久久久久女警| 影音四色91| 日本女人一区二区三区| 日本一道高清一区二区三区| 久久国产情侣| 97精品视频在线观看| 在线中文字幕观看| wwwwww国产| 在线亚洲欧美| 国产视频1区2区3区| 91网站最新地址| 久久天天躁夜夜躁狠狠躁2022| 五月激情综合婷婷| 国产中文字幕在线播放| 国产精欧美一区二区三区| av成人观看| 在线观看免费黄视频| 最近2019中文字幕大全第二页| 一区二区国产精品视频| 免费观看欧美成人禁片| 中文字幕第一区二区| 在线中文字幕av| 2018狠狠干| 成人综合在线视频| 成r视频免费观看在线播放| 亚洲精品乱码久久久久久不卡| 成人欧美大片| 综合色一区二区| 亚洲日本视频在线| 成人av电影观看| 久久91亚洲人成电影网站| 国产69久久精品成人| 给我看免费高清在线观看| 欧美videos另类精品| 国产激情美女久久久久久吹潮| 欧美一级视频免费| 亚洲最大成人免费视频| 18禁裸乳无遮挡啪啪无码免费| 欧美人妻精品一区二区免费看| 午夜久久影院| 精品人妻无码一区二区三区| 欧美日韩成人激情| 国产精品极品尤物在线观看| 色综合天天做天天爱| 成人中文字幕av| 国产原创在线观看| 国产精华一区二区三区| 国产精品黄色大片| 888av在线视频| 欧洲金发美女大战黑人| 欧美一区二区三区四区在线| а√天堂www在线а√天堂视频| 国产一区国产二区国产三区| 日韩精品欧美成人高清一区二区| 亚洲婷婷国产精品电影人久久| 日本福利在线| 亚洲精选91| 色欲av无码一区二区三区| 欧美日产在线观看| 丝袜国产日韩另类美女| 色偷偷精品视频在线播放| 国产精品久久久久久亚洲伦| 男人的天堂av网| 天天综合色天天综合色hd| 天堂网视频在线观看| 精品婷婷伊人一区三区三| 国产成人福利片| 免费观看一级欧美片| 国产精品一区三区在线观看| 一本色道久久综合亚洲精品酒店| 中文字幕日韩免费| 国产精品久久久久久搜索| 欧美日韩另类字幕中文| 日本a在线免费观看| 99久久久无码国产精品6| 欧美激情一区二区三区不卡| 在线视频一区二区三区| 中文字幕在线观看视频一区| 在线视频日韩一区| 亚洲视频免费| 欧美激情麻豆| julia中文字幕久久亚洲蜜臀| 婷婷无套内射影院| 一本色道**综合亚洲精品蜜桃冫| 日韩在线a电影| 国产精品黄色在线观看| 欧美在线视频精品| 九九热在线免费视频| 精品一区二区三区蜜桃在线| 亚洲三区在线| www.视频一区| 一级爱爱免费视频| 高潮一区二区三区| 亚洲一级片在线播放| 中文在线网在线中文| 飘雪影院手机免费高清版在线观看| 制服丝袜国产精品| 久久久久看片| 欧美激情视频在线免费观看 欧美视频免费一| 在线播放高清视频www| 2020日本不卡一区二区视频| 日本一级片免费| 久久黄色网页| 深爱五月综合网| 亚洲av永久无码国产精品久久| 国产日韩欧美第一页| 国产一区二区在线电影| 日本韩国精品一区二区在线观看| 亚洲激情在线播放| 欧美a一片xxxx片| 日本中文字幕一区二区有码在线| 亚洲欧美另类图片| 国产精品久久久精品a级小说| 在线观看福利电影| 国产女人18毛片水真多成人如厕| 成人h在线播放| 欧美日韩亚洲一区二区| 日本精品一区二区三区视频| 肉色超薄丝袜脚交69xx图片| 欧美日韩国产丝袜美女| 亚洲精品第三页| 国产一级成人av| 国产精品久久毛片a| 日韩福利视频在线观看| 91福利国产成人精品播放| 欧美电影完整版在线观看| aaaaa黄色片| 亚洲av少妇一区二区在线观看| 九九这里只精品视在线99| 国产在线观看99| 成人动漫在线视频| 国产伦精品一区三区精东| 久久久久国产精品人| 精品国产无码在线观看| 日日躁夜夜躁白天躁晚上躁91| 欧美性猛交xxxx乱大交91| 国产经典欧美精品| 中文字幕高清不卡| 欧美精品一区二区视频| 欧美一级大片| 成人在线视频免费| www.com.av| 久久久成人av| 精品国产一区二区三区久久久蜜臀| 久久这里只有精品18| 阿v天堂2018| 欧美大片免费播放器| 深夜福利日韩在线看| 午夜精品久久久久99热蜜桃导演| 男人扒开美女尿口无遮挡图片| 国产麻豆免费| 国产精品夜夜夜爽阿娇| 国产精品一二三四| 欧美午夜不卡在线观看免费| 国产在线二区| 欧美一级生活片| 美女毛片在线看| 欧美亚洲视频一区| 青青草在线视频免费观看| 婷婷激情综合五月天| 日韩亚洲不卡在线| 男人天堂视频在线观看| 欧美日韩美女一区二区| 成 人 免费 黄 色| 日韩欧美一二三区| 久久久成人av毛片免费观看| 一本一道久久a久久综合蜜桃| 国语精品视频| 成人啪啪18免费游戏链接| 久久福利毛片| 国产精品成人国产乱一区| 亚洲精品福利视频网站| 姬川优奈av一区二区在线电影| 国产大学生粉嫩无套流白浆| 欧美与动交zoz0z| 精品国产成人av在线免| 亚洲高清不卡| 国产麻豆麻豆| 午夜精品久久久久久久第一页按摩| 99精品在免费线中文字幕网站一区| 黑人巨大国产9丨视频| 国产成人三级在线观看视频| 日本a级片免费| 91成人精品在线| 国产精品视频第一页| av电影网站在线观看| 国产精品免费看久久久无码| 久久国产欧美精品| 国产精品一卡二卡| 网站免费在线观看| 日韩欧美一区二区三区四区| 懂色中文一区二区在线播放| 国产香蕉在线观看| 日本日本精品二区免费| 午夜精品久久久久久久99樱桃| 亚洲一区二区精品3399| 91久久久国产精品| 精品一区二区观看| 亚洲免费高清视频| 99国产在线播放| 亚洲欧美日韩中文字幕一区二区三区| 久久日本片精品aaaaa国产| 99久久精品免费视频| 久久久久亚洲av无码网站| 久久视频一区| 国产精品白嫩初高中害羞小美女| 好吊的妞视频这里都有| 国产一区二区在线观看免费视频| 国产有码在线一区二区视频| 久久久国产精品网站| 久久亚洲电影| 亚洲国产精品欧美久久| 欧美理论在线观看| 成人无码www在线看免费| 色综合久久天天综合网| 日韩欧美一区免费| 国产精品日韩精品中文字幕| 国产又爽又黄免费视频| 粗大的内捧猛烈进出视频| 国内高清免费在线视频| 欧美视频精品一区| 久久综合久久88| 日韩久久久久久久久久| 激情偷拍久久| 四虎www成人影院观看| 日产亚洲一区二区三区| 熟女人妇 成熟妇女系列视频| 日韩a在线播放| 国产97色在线 | 日韩| 一区二区三区91| 日韩欧美中文一区二区| 久久麻豆精品| 国产精品欧美在线观看| 加勒比综合在线| 国产精品186在线观看在线播放| 久久国产综合视频| 免费大片黄在线观看| 手机精品视频在线| 国内不卡一区二区三区| 91麻豆精品秘密入口| 成人免费三级在线| 日韩久久精品视频| 69国产成人精品视频软件| 丰满少妇在线观看资源站| 精品亚洲视频在线| 五月亚洲婷婷| 天使と恶魔の榨精在线播放| 中文无码av一区二区三区| 在线午夜视频|