青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

萬星星@豌豆莢 歡迎加入我們
一個吃軟飯的男人!!!!!我只想寫程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0


很久沒有寫技術(shù)方面的東西了,這半年主要是在學(xué)習(xí)別人的東西,對自己提高比較大,算是一次技術(shù)回籠吧,這次學(xué)習(xí)之旅目的是結(jié)束技術(shù)方面的專注,開始向應(yīng)用方面找突破口,也就是完成技術(shù)積累或者為技術(shù)的積累做堅實的準(zhǔn)備。

c/C++的一個讓人瘋狂的地方就是內(nèi)存管理,非法訪問、越界、野指針、泄漏、內(nèi)存分配器等諸多問題,有時候一個編程老手也會迷惘困惑。Crt有一些堆棧檢查的函數(shù)可以完成基本的內(nèi)存狀況檢查,MFC也有一些簡單的對象檢查機制,當(dāng)然好的算是java、.net等sdk的超重量級封裝了,即使發(fā)生對象錯誤也能把堆棧信息明明白白的告訴你(至少表面上是這樣,具體我對這兩種語言沒有做過開發(fā))。下面介紹的是某牛公司實現(xiàn)的內(nèi)存分配工具,基本實現(xiàn)了內(nèi)存泄漏檢查,對象合法性檢查,對于我來說已經(jīng)夠用了。


為了對內(nèi)存分配塊進(jìn)行跟蹤,設(shè)計如下結(jié)構(gòu)體:

//+--------------------------------------------------------------
//
// 每個請求分配內(nèi)存塊的前綴結(jié)構(gòu)體
// 用來跟蹤所有請求分配塊以及請求分配名稱
//
//---------------------------------------------------------------
struct DBGALLOCHDR
{
    DBGALLOCHDR
*    pdbgahPrev; // 前一個內(nèi)存塊頭
    DBGALLOCHDR*    pdbgahNext; // 后一個內(nèi)存塊頭
    DWORD           iAllocated; // 記錄是第幾次請求分配操作
    DWORD           tid;        // 請求分配線程的ID
    size_t          cbRequest;  // 請求分配大小
    char            szName[64]; // 請求分配塊名稱
    DWORD           adwGuard[4];// 保護頭
}
;

//+--------------------------------------------------------------
//
// 每個請求分配內(nèi)存塊的后綴結(jié)構(gòu)體
// 使用特定的數(shù)據(jù)填充用來檢測指針是合法
//
//---------------------------------------------------------------
struct DBGALLOCFOOT
{
    DWORD adwGuard[
4];
}
;

// 內(nèi)存跟蹤塊的根,通過根可以獲取所有分配塊
DBGALLOCHDR g_dbgahRoot =
{
    
&g_dbgahRoot,
    
&g_dbgahRoot,
    
0,
    (DWORD)
-1
}
;


為了實現(xiàn)多線程內(nèi)存分配跟蹤,采用Tls技術(shù)使用線程局部對象保存當(dāng)前分配信息:
// 線程局部對象結(jié)構(gòu)體,輔助實現(xiàn)每個線程的請求內(nèi)存分配記錄
struct DBGTHREADSTATE
{
    DBGTHREADSTATE
* ptsNext;
    DBGTHREADSTATE
* ptsPrev;

    
// Add globals below
    void*           pvRequest;  // 線程最后一次請求分配內(nèi)存的指針
    size_t          cbRequest;  // 線程最后一次請求分配內(nèi)存的大小
}
;



// 調(diào)試期間實際分配內(nèi)存大小=請求分配+分配頭+分配尾
size_t _ActualSizeFromRequestSize(size_t cb)
{
    
return cb+sizeof(DBGALLOCHDR)+sizeof(DBGALLOCFOOT);
}


主要實現(xiàn)的內(nèi)存分配工具有如下這些:
void*   _MemAlloc(ULONG cb);
void*   _MemAllocClear(ULONG cb);
HRESULT _MemRealloc(
void** ppv, ULONG cb);
ULONG   _MemGetSize(
void* pv);
void    _MemFree(void* pv);
HRESULT _MemAllocString(LPCTSTR pchSrc, LPTSTR
* ppchDst);
HRESULT _MemAllocString(ULONG cch, LPCTSTR pchSrc, LPTSTR
* ppchDst);
HRESULT _MemReplaceString(LPCTSTR pchSrc, LPTSTR
* ppchDest);

#define MemAlloc(cb)                            _MemAlloc(cb)
#define MemAllocClear(cb)                       _MemAllocClear(cb)
#define MemRealloc(ppv, cb)                     _MemRealloc(ppv, cb)
#define MemGetSize(pv)                          _MemGetSize(pv)
#define MemFree(pv)                            _MemFree(pv)
#define MemAllocString(pch, ppch)               _MemAllocString(pch, ppch)
#define MemAllocStringBuffer(cch, pch, ppch)    _MemAllocString(cch, pch, ppch)
#define MemReplaceString(pch, ppch)             _MemReplaceString(pch, ppch)
#define MemFreeString(pch)                      _MemFree(pch)


通過宏實現(xiàn)類的new delete重寫:
#define DECLARE_MEMALLOC_NEW_DELETE() \
    inline 
void* __cdecl operator new(size_t cb)    return(MemAlloc(cb)); } \
    inline 
void* __cdecl operator new[](size_t cb)  return(MemAlloc(cb)); } \
    inline 
void __cdecl operator delete(void* pv)   { MemFree(pv); }

#define DECLARE_MEMCLEAR_NEW_DELETE() \
    inline 
void* __cdecl operator new(size_t cb)    return(MemAllocClear(cb)); } \
    inline 
void* __cdecl operator new[](size_t cb)  return(MemAllocClear(cb)); } \
    inline 
void __cdecl operator delete(void* pv)   { MemFree(pv); }


在應(yīng)用的時候可以重寫全局new delete:
// 測試全局new delete
void* __cdecl operator new(size_t cb)    return(MemAlloc(cb)); }
void* __cdecl operator new[](size_t cb)  return(MemAlloc(cb)); }
void __cdecl operator delete(void* pv)   { MemFree(pv); }


使用注意:
進(jìn)程啟動時候需要調(diào)用:
_DbgDllProcessAttach();
_afxGlobalData._hProcessHeap = GetProcessHeap();

進(jìn)程退出的時候需要調(diào)用:
_DbgDllProcessDetach();

測試用例:

// 測試基本類型
void TestBuiltin()
{
    
// 基本類型
    int* pInt = new int(10);
    
int* pIntAry = new int[10];
    
char* pStr = new char[100];
    MemSetName((pStr, 
"String"));
}


// 測試class
void TestClass()
{
    Cls
* pCls = new Cls();
}


// 測試釋放
void TestOk()
{
    Cls
* pCls = new Cls();
    delete pCls;
    pCls 
= NULL;
}


DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    
int* pIntAry = new int[100];
    
return 0;
}


// 測試多線程
void TestMultiThread()
{
    HANDLE hHandle 
= CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
    WaitForSingleObject(hHandle, 
-1);
}


int main(int argc, char* argv[])
{
    _DbgDllProcessAttach();

    _afxGlobalData._hProcessHeap 
= GetProcessHeap();

    TestBuiltin();
    TestClass();
    TestMultiThread();
    TestOk();

    _DbgDllProcessDetach();
    
return 0;
}


調(diào)試輸出窗口結(jié)果:
A +    4 -    0 = [      4]
A +   40 -    0 = [     44]
A +  100 -    0 = [    144]
A +    8 -    0 = [    152]
A +  400 -    0 = [    552]
The thread 0x1D38 has exited with code 0 (0x0).
A +    8 -    0 = [    560]
F +    0 -    8 = [    552]
---------- Leaked Memory Blocks ----------
p=0x00144354  cb=400  #=4    TID:0x1d38
p=0x00144294  cb=8    #=3    TID:0x1878
p=0x001441a4  cb=100  #=2    TID:0x1878 String
p=0x001440ec  cb=40   #=1    TID:0x1878
p=0x00142a54  cb=4    #=0    TID:0x1878
total size 552, peak size 560
---------- Leaked Memory Blocks End ------


其中A表示分配 F表示釋放

 

該工具本人初試沒有中毒癥狀,打算納入個人小寶庫中,希望大家喜歡!

下載

posted on 2009-06-03 16:16 萬連文 閱讀(2824) 評論(11)  編輯 收藏 引用 所屬分類: 亂七八糟

FeedBack:
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-03 16:51 | OwnWaterloo
operator delete[]呢?  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-03 17:33 | 萬連文
因為底層實現(xiàn)是Heap**操作,所以delete和delete[]都會調(diào)用HeapFree,所以恰好可以完成任務(wù)。  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-03 21:30 | OwnWaterloo
@萬連文
某某牛庫是哪個庫?
其實跟有沒有庫這樣做沒關(guān)系,跟該庫牛不牛也沒什么關(guān)系。
不能跟著別人錯。

底層實現(xiàn)是HeapXXX?
其實跟底層實現(xiàn)到底是什么沒關(guān)系。
C++標(biāo)準(zhǔn)沒要求底層實現(xiàn)怎么做, 但是要求重載operator new必須有其對應(yīng)形式的operator delete重載。


跟測不測試也沒關(guān)系。
一次不帶TT不會懷上不等于次次都不會懷上。
一個編譯器上測試成功,不等于每個編譯器都能測試成功。
在某個編譯器上能測試通過,并不能證明或證偽。


編寫operator new/delete要遵守一些規(guī)范。
HeapAlloc能否處理 size=0?
HeapAlloc分配失敗時的new_hanlder處理?
對其他形式new的隱藏?
"重載"(而不是覆蓋全局標(biāo)準(zhǔn))op new時,如果不提供相應(yīng)形式的op delete,是否也能正確工作?
與其在不同平臺,不同編譯器,甚至是相同編譯器的不同版本下進(jìn)行測試,不如一開始就按照標(biāo)準(zhǔn)形式編寫。  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-04 07:42 | 萬連文
感謝你的指導(dǎo), 我沒有說跨平臺, 也沒有說實用多個編譯器,我一直使用VC系列工具在Windows上面寫程序,其他的編譯器和OS了解很少,對C++標(biāo)準(zhǔn)也研究不夠,出發(fā)點只是想找到一個經(jīng)過驗證的(大的、成功的產(chǎn)品使用過的)簡便的工具。 我想軟件工具都不是完美的,考慮太多就沒完沒了了,我堅持實用原則。  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-04 10:32 | OwnWaterloo
  1#include <stddef.h>
  2#include <stdlib.h>
  3#include <stdio.h>
  4#include <vector>
  5
  6#include <stdexcept>
  7
  8
  9#if defined(_MSC_VER) && _MSC_VER<1400
 10#include <new.h>
 11namespace std using ::set_new_handler; using ::new_handler; }
 12#else
 13#include <new>
 14#endif
 15
 16
 17void* allocate(size_t size) {
 18    if (size==0) size = 1;
 19    for (void* p=0;;) {
 20        p = malloc(size);
 21        if (p) {
 22            printf("allocate %p\n",p);
 23            return p;
 24        }

 25        std::new_handler handler = std::set_new_handler(0);
 26        std::set_new_handler(handler);
 27        if (handler)
 28            handler();
 29        else
 30            throw std::bad_alloc();
 31    }

 32}

 33
 34void deallocate(void* ptr) {
 35    printf("deallocate %p\n",ptr);
 36    free(ptr);
 37}

 38
 39void* operator new(size_t size) return allocate(size); }
 40void* operator new[](size_t size) return allocate(size); }
 41void operator delete(void* ptr) { deallocate(ptr); }
 42
 43class C {
 44    static int count;
 45public:
 46    static bool fail;
 47    C() {
 48        if (fail)
 49            throw std::exception();
 50        printf("C::C(),%d\n",++count);
 51    }

 52    ~C() {
 53        printf("C::~C(),%d\n",count--);
 54    }

 55    C(const C& ) {
 56        printf("C::(const C&),%d\n",++count);
 57    }

 58
 59
 60    //void* operator new(size_t,void* place) { return place; }
 61    void* operator new(size_t size) return allocate(size); }
 62    void* operator new[](size_t size) return allocate(size); }
 63    void operator delete(void* ptr) { deallocate(ptr); }
 64}
;
 65bool C::fail;
 66int C::count;
 67
 68struct S {
 69    static bool fail;
 70    S() {
 71        if (fail)
 72            throw std::exception();
 73        printf("construct\n");
 74    }

 75    ~S() {
 76        printf("destroy\n");
 77    }

 78}
;
 79bool S::fail;
 80
 81void test_class(int dim) {
 82    if (dim<=0)
 83        return;
 84    C::fail = dim==4;
 85    C* arr = new C[dim];
 86    delete[]  arr;
 87}

 88
 89
 90void test_global(int dim) {
 91    if (dim<=0)
 92        return;
 93    S::fail = dim==4;
 94    S* arr = new S[dim];
 95    delete[] arr;
 96}

 97
 98int main() {
 99    using namespace std;
100    int dim = 0;
101    for (printf("input dim: ");scanf("%d",&dim)==1;printf("input dim: "))
102    {
103        try {
104            test_class(dim);
105        }

106        catch (std::exception& ) {
107            printf("  ---- catch an exception ----\n");
108        }

109        try {
110            test_global(dim);
111        }

112        catch (std::exception& ) {
113            printf("  ---- catch an exception ----\n");
114        }

115    }

116}

117
 
有兩個底層分配函數(shù)allocate和deallocate,它們使用malloc和free。
用這兩個函數(shù)實現(xiàn)全局的3個op new,op new[], op delete,沒有op delete[]
還用這兩個函數(shù)實現(xiàn)了C的3個op new,op new[], op delete,同樣沒有op delete[]
用如下參數(shù)編譯
cl /EHsc /MD /analyze /W3
 
你看看結(jié)果吧。
我用vc8、9測過(vc6不支持動態(tài)crt庫,vc10我沒裝)。
反正兩處delete[] arr;都沒有調(diào)用 op delete。
它們調(diào)用那個全局的,沒有被重寫的op delete[]。
如果靜態(tài)鏈接,該全局默認(rèn)的op delete[]會被inline, 再調(diào)用該編譯單元中定義的op delete。
如果動態(tài)鏈接,op delete[]不會被inline,會調(diào)用crt庫中提供的op delete。
總之,這兩處delete[] arr;都沒有調(diào)用deallocate。
 
當(dāng)然, 你可以說你只靜態(tài)鏈接到crt庫。
也可以說你的allocate和deallocate底層實現(xiàn)絕對會一直保持與vc提供的crt兼容
但是,你的代碼的用戶了解么?
難道你打算在文檔中寫“使用我的庫的代碼者,使用的crt庫必須滿足XXX要求,必須自己測試YYY”,只是為了你自己可以少寫一個 op delete[]
這不是程序庫開發(fā)者的態(tài)度。
 
還有兩個小問題。
C* pc = static_cast<C*>(malloc(sizeof(*pc));
new (pc) C; // 編譯錯誤
C* pc2 = new (std::nothrow) C; // 編譯錯誤
 
當(dāng)然, 你還是可以說你絕對不會用這種東西, 你是實用主義嘛。
但是你的庫的使用者呢?
 
 
“出發(fā)點只是想找到一個經(jīng)過驗證的(大的、成功的產(chǎn)品使用過的)簡便的工具”
你覺得這可以說明該產(chǎn)品中的每個細(xì)節(jié)都是無可挑剔的么?
越是大的產(chǎn)品,測試越不容易,更不容易暴露其中的問題,同時也許忽悠客戶也更容易。
 
 
確實沒有任何事物都是完美的,但不能連追求完美的心都舍棄了。
同時,從實用角度出發(fā),讓該庫變得更完美,所付出的代價非常小,“按規(guī)則”辦事就可以了,10來行代碼的事,何樂而不為?
規(guī)則可以見《EffCpp》或者《C++CodingStandard》。
  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-04 10:32 | OwnWaterloo
sorry…… 不小心提交了2次 ……
我自己刪掉一個 ……  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-04 11:29 | 萬連文
因為我是看微軟這么做的,自己確實沒有發(fā)現(xiàn)什么錯誤,我沒法不承認(rèn)她的實現(xiàn)可以為我所用,可能就是中毒太深吧。您上面寫的那些已經(jīng)超出了我的知識范圍,我需要好好學(xué)習(xí)。至于 vc6不支持動態(tài)crt庫 好像可以通過修改/MLd到/MDd實現(xiàn)。  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-04 12:04 | OwnWaterloo
@萬連文
微軟的哪? MFC?

上面的命令行 cl /MD 已經(jīng)告訴編譯器鏈接到動態(tài)庫了。
vc6不支持是因為它只有靜態(tài)庫。 crt的動態(tài)庫是跟.net那一套東西一起出來的。  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-04 12:13 | 萬連文
微軟的什么我沒有必要告訴你,crt的動態(tài)庫我不曉得你怎么想,用dependency工具看看就曉得依賴不依賴了,我對自己的認(rèn)識也不是十足的把握。   回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-04 17:59 | 99網(wǎng)上書城
感謝你的指導(dǎo)  回復(fù)  更多評論
  
# re: 技術(shù)回歸01-Windows內(nèi)存分配工具
2009-06-05 17:50 | Touchsoft
struct DBGALLOCHDR
這個結(jié)構(gòu)好像在調(diào)試時見到過。  回復(fù)  更多評論
  
簡歷下載
聯(lián)系我

<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(66)

隨筆分類

隨筆檔案

相冊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产免费| 老司机67194精品线观看| 亚洲一级二级| 亚洲伊人久久综合| 亚洲午夜在线视频| 亚洲欧美中文日韩v在线观看| 野花国产精品入口| 亚洲欧美视频| 久久人人看视频| 91久久国产自产拍夜夜嗨| 亚洲国产精品电影在线观看| 亚洲日本va午夜在线影院| 亚洲午夜伦理| 久久精品夜色噜噜亚洲a∨| 欧美11—12娇小xxxx| 欧美精品一区在线| 国产精品午夜在线观看| 悠悠资源网久久精品| a4yy欧美一区二区三区| 欧美亚洲视频| 免费观看在线综合| 亚洲人成毛片在线播放女女| 亚洲一区二区三区乱码aⅴ| 久久久精品2019中文字幕神马| 欧美黑人多人双交| 国产日韩一区二区三区在线| 亚洲美洲欧洲综合国产一区| 午夜精品成人在线视频| 亚洲日产国产精品| 久久午夜激情| 国产综合av| 亚洲欧美中文另类| 亚洲精品黄色| 猫咪成人在线观看| 国产一区二区三区在线观看免费| 99精品国产高清一区二区| 久久精品国产99国产精品澳门| 欧美黄色成人网| 午夜精品久久久久久久男人的天堂| 久热精品视频在线| 国产视频久久| 午夜精品区一区二区三| 亚洲国产精品一区二区久| 欧美一区免费视频| 国产精品久久999| 一本到12不卡视频在线dvd| 久久久久成人精品| 亚洲视频在线一区| 欧美日韩国产成人在线91| 亚洲黑丝在线| 欧美高清在线一区| 两个人的视频www国产精品| 国产精品一卡二| 亚洲综合色婷婷| 国产精品99久久久久久久久久久久| 欧美黄污视频| 亚洲精品一品区二品区三品区| 免费看av成人| 久久综合九色综合欧美狠狠| 麻豆成人在线播放| 农村妇女精品| 久久久精品国产免大香伊 | 欧美专区在线观看| 国产精品日韩| 午夜精品久久| 亚洲欧美日韩天堂| 国产日韩亚洲欧美| 久久精品日韩欧美| 久久黄色影院| 亚洲国产天堂久久综合网| 欧美国产精品中文字幕| 老司机免费视频久久| 亚洲高清在线观看一区| 亚洲黄色精品| 欧美午夜宅男影院在线观看| 亚洲男女自偷自拍图片另类| 亚洲午夜电影在线观看| 国产欧美日韩不卡免费| 久久蜜桃资源一区二区老牛| 久久久久女教师免费一区| 亚洲高清精品中出| 亚洲精品韩国| 国产欧美日韩亚洲精品| 男人天堂欧美日韩| 欧美激情视频在线播放| 亚洲一区图片| 久久成人精品一区二区三区| 亚洲国产成人一区| 一本一道久久综合狠狠老精东影业| 国产精品免费网站在线观看| 久久精品国产69国产精品亚洲| 久久久久久一区二区| 一本色道久久综合精品竹菊 | 久久视频这里只有精品| 免费亚洲网站| 亚洲一区成人| 久久精品视频播放| 中文在线资源观看网站视频免费不卡| 亚洲在线观看免费| 亚洲乱码国产乱码精品精可以看| 亚洲男人的天堂在线| 91久久在线| 亚洲一级黄色av| 91久久精品网| 小辣椒精品导航| 亚洲美女视频网| 久久精品99国产精品日本| 夜夜爽av福利精品导航| 久久超碰97人人做人人爱| 亚洲色图在线视频| 模特精品在线| 久色成人在线| 国产日韩欧美亚洲一区| 日韩午夜三级在线| 亚洲精品男同| 玖玖综合伊人| 久久久一区二区三区| 欧美一区二区视频在线观看2020| 久久婷婷综合激情| 欧美成人一区二区在线| 一区二区三区黄色| 亚洲黄色成人| 国产日韩在线播放| 欧美日韩国产成人在线91| 欧美福利视频一区| 欧美69视频| 久久精品伊人| 久久激情五月激情| 久久国产精品一区二区三区| 亚洲欧美日韩综合一区| 午夜精品久久久久久久久久久久久 | 亚洲性感美女99在线| 欧美大胆成人| 中文欧美日韩| 欧美激情一二区| 欧美专区日韩专区| 午夜精品区一区二区三| 亚洲天堂av图片| 亚洲理论在线观看| 黄色成人在线网址| 国产亚洲成年网址在线观看| 欧美视频中文在线看| 欧美日韩成人一区二区三区| 欧美www在线| 欧美一区在线直播| 久久精品盗摄| 亚洲欧洲av一区二区三区久久| 亚洲视频日本| 亚洲小少妇裸体bbw| 午夜精彩国产免费不卡不顿大片| 亚洲国产成人av在线| 国产日韩亚洲欧美| 精品成人在线| 精品va天堂亚洲国产| 亚洲一二三级电影| 亚洲欧美日本另类| 久久爱另类一区二区小说| 欧美成人一区在线| 蜜臀av国产精品久久久久| 99精品热6080yy久久| 欧美在线观看视频一区二区| 久久久久久久一区二区| 国产精品亚洲综合色区韩国| 狠狠v欧美v日韩v亚洲ⅴ| 一区二区冒白浆视频| 欧美在线观看视频一区二区| 91久久国产综合久久| 亚洲淫片在线视频| 欧美亚男人的天堂| 99国产精品| 欧美韩国日本综合| 免费观看成人www动漫视频| 欧美日韩在线大尺度| 亚洲精品一区在线观看香蕉| 午夜精品久久久久久久99黑人| 欧美成人免费在线| 久久婷婷亚洲| 很黄很黄激情成人| 欧美超级免费视 在线| 久久深夜福利免费观看| 国产精品美女久久福利网站| 在线视频欧美一区| 一区二区三区久久久| 欧美日韩极品在线观看一区| 一区二区欧美日韩视频| 99精品国产在热久久下载| 欧美刺激性大交免费视频| 亚洲精品视频二区| 中文av一区特黄| 国产精品视频一区二区三区| 久久久999精品免费| 久久午夜视频| av72成人在线| 久久九九全国免费精品观看| 亚洲一区二区黄色| 国产欧美三级| 最新中文字幕亚洲| 国产视频欧美视频| 欧美激情精品久久久久久大尺度| 欧美亚一区二区|