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

曠野的呼聲

路漫漫其修遠(yuǎn)兮 吾將上下而求索

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

【日記】最近干了點(diǎn)嘛?

        現(xiàn)在已經(jīng)是大學(xué)生涯的最后階段了,回首過(guò)去的四年真是充滿(mǎn)感慨。由于畢業(yè)設(shè)計(jì)早早完事以至于現(xiàn)在略顯無(wú)聊,呵呵。但是一直都沒(méi)閑著,最近在研究?jī)?nèi)存管理方面的東西,參考了不少的書(shū),有IBM出的那本《C++應(yīng)用程序性能與優(yōu)化》、《深入解析Windows操作系統(tǒng)》、《Windows核心編程》等等。目的就是想對(duì)Windows的內(nèi)存管理策略以及Windows下面使用C++編程如何更好的使用內(nèi)存有更深入和更清醒的認(rèn)識(shí)。另外在這些積累之后可能會(huì)研究一下內(nèi)存池技術(shù)。
        前兩天為老師做一個(gè)Demo,中間寫(xiě)了一些簡(jiǎn)單的輔助代碼,沒(méi)什么用,發(fā)這兒留個(gè)紀(jì)念,聊勝于無(wú)。

//////////////////////////////////////////////////////////////////////////
// 版權(quán)所有 董波
//////////////////////////////////////////////////////////////////////////
// File :  Buffer.h
// Author: Dongbo
// Date:   2009.1.14
// Description: 對(duì)動(dòng)態(tài)分配內(nèi)存的包裝以提供更高更好的安全性
//////////////////////////////////////////////////////////////////////////
#ifndef _DB_BUFFER_H_
#define _DB_BUFFER_H_
#include 
<cassert>

/*
適用情況:
需要?jiǎng)討B(tài)分配內(nèi)存,且需要兼容原有API的時(shí)候!此時(shí)auto_ptr并不適用!
*/

namespace db
{
    
// 基本實(shí)現(xiàn)細(xì)節(jié)
    namespace detail
    
{
        
// Base_Buffer
        template < typename _Ty >
        
class Base_Buffer
        
{
        
private:
            Base_Buffer( 
const Base_Buffer<_Ty>& );
            Base_Buffer
& operator = ( const Base_Buffer<_Ty>& );
        
public:
            Base_Buffer( unsigned uCount ):m_pTmp(
0),m_uCount( uCount )
            
{
                
if0 != uCount )
                
{
                    m_pTmp 
= new _Ty[uCount];
                }
  
            }

            
~Base_Buffer()
            
{
                
if0 != m_pTmp )
                
{
                    delete []m_pTmp;
                    m_pTmp 
= 0;
                }

            }

            _Ty
* GetBufPtr()
            
{
                assert( 
0 != m_pTmp );
                
return m_pTmp;
            }

            
const _Ty* GetBufPtr() const
            
{
                assert( 
0 != m_pTmp );
                
return m_pTmp;
            }

            unsigned  GetCount() 
const
            
{
                
return m_uCount;
            }

            
// 2009.1.20添加 增加重設(shè)功能
            void ReSize( unsigned uSize )
            
{
                
if0 != uSize )
                
{
                    
if0 != m_pTmp )
                    
{
                        delete []m_pTmp;
                        m_pTmp 
= NULL;
                    }

                    m_pTmp 
= new _Ty[ uSize ]; 
                    m_uCount 
= uSize;
                }
    
            }

        
protected:
            _Ty
*               m_pTmp;
            unsigned           m_uCount;
        }
;
    }
 
    template 
< typename _Ty >
    
class Buffer : public detail::Base_Buffer< _Ty >
    
{
    
public:
        Buffer( unsigned uCount ) : detail::Base_Buffer
<_Ty>(uCount)
        
{
        }

    }
;

    
class ByteBuffer : public Buffer<char>
    
{
    
public:
        ByteBuffer( unsigned uSize ) : Buffer
<char>(uSize)
        
{        }
    
public:
        unsigned  GetBytesNum() 
const
        
{
            
return Buffer<char>::m_uCount;
        }

    }
;
    typedef ByteBuffer CharBuffer;
}

endif // #ifndef _DB_BUFFER_H_  


//////////////////////////////////////////////////////////////////////////
// 版權(quán)所有 董波
//////////////////////////////////////////////////////////////////////////
// File :  string_cast.h
// Author: Dongbo
// Date:   2009.1.16
// Description: char字符串與wchar_t字符串之間的轉(zhuǎn)換
//////////////////////////////////////////////////////////////////////////
#ifndef _DB_STRING_CAST_H_
#define _DB_STRING_CAST_H_


#include 
<string>
#include 
<cstdlib>
#include 
"Buffer.h"

namespace db
{
    
// 幾乎從來(lái)不用,用于擴(kuò)展!
    template < typename _Ty > 
    
class string_cast 
    

    
private
        string_cast(); 
        template 
< typename _Dummy > 
        string_cast
& operator = ( const string_cast<_Dummy>& ); 
        template 
< typename _Dummy > 
        string_cast( 
const string_cast<_Dummy>& ); 
    }


    
// 到wchar_t字符串的轉(zhuǎn)換
    template <> 
    
class string_cast< wchar_t > 
    

    
private
        
// 避免產(chǎn)生一些奇怪的語(yǔ)法!
        string_cast(); 
        template 
< typename _Dummy > 
        string_cast
& operator = ( const string_cast<_Dummy>& ); 
        template 
< typename _Dummy > 
        string_cast( 
const string_cast<_Dummy>& ); 
    
public
        template 
< typename _TCHAR > 
        string_cast( 
const _TCHAR* str ) 
        

            
if( NULL == str ) 
            

                
throw std::bad_cast( "目標(biāo)串為空" ); 
            }
 
            m_strBuf 
= str;
        }
 

        template 
<> 
        string_cast( 
const char* str ) 
        

            
// 檢查指針狀態(tài)
            if( NULL == str ) 
            

                
throw std::bad_cast( "目標(biāo)串為空" ); 
            }
 

            
// 獲取長(zhǎng)度以創(chuàng)建緩沖區(qū)
            unsigned iLength = strlen( str ) + 1

            Buffer
<wchar_t> buffer( iLength ); 

            
// 修改現(xiàn)場(chǎng)以支持中文
            setlocale( LC_CTYPE, "chs" ); 

            
// 轉(zhuǎn)換
            size_t iSize = 0
#if _MSC_VER > 1310
            mbstowcs_s( 
&iSize, buffer.GetBufPtr(), iLength, str, iLength ); 
#else
            mbstowcs( buffer.GetBufPtr(), str, iLength );
#endif 

            
// 還原現(xiàn)場(chǎng)
            setlocale( LC_CTYPE, "" ); 

            
// 基本錯(cuò)誤檢查
            if( (iSize<<1< iLength ) 
            

                
throw std::bad_cast( "轉(zhuǎn)換未完成" ); 
            }
 

            
// 拷貝到字符串中
            m_strBuf.assign( buffer.GetBufPtr() ); 
        }
 

        
// 獲取結(jié)果!
        operator std::wstring() const 
        

            
return m_strBuf; 
        }
 

    
public:
        
const std::wstring& ToWstr() const
        
{
            
return m_strBuf;
        }

    
protected
        std::wstring m_strBuf; 
    }


    
// 向string的轉(zhuǎn)換
    template<> 
    
class string_cast< char > 
    

    
private
        string_cast(); 
        template 
< typename _Dummy > 
        string_cast
& operator = ( const string_cast<_Dummy>& ); 
        template 
< typename _Dummy > 
        string_cast( 
const string_cast<_Dummy>& ); 
    
public
        template 
< typename _TCHAR > 
        string_cast( 
const _TCHAR* str ) 
        

            
if( NULL == str ) 
            

                
throw std::bad_cast( "目標(biāo)串為空" ); 
            }
 
            m_strBuf 
= str;
        }
 

        template 
<> 
        string_cast( 
const wchar_t* str ) 
        

            
if( NULL == str ) 
            

                
throw std::bad_cast( "目標(biāo)串為空" ); 
            }
 

            unsigned iLength 
= ( wcslen( str ) + 1 )<<1

            CharBuffer buffer( iLength ); 

            
// 修改現(xiàn)場(chǎng)以支持中文
            setlocale( LC_CTYPE, "chs" ); 

            size_t iSize 
= 0
#if _MSC_VER > 1310
            wcstombs_s( 
&iSize, buffer.GetBufPtr(), iLength, str, iLength ); 
#else
            wcstombs( buffer.GetBufPtr(), str, iLength );
#endif

            setlocale( LC_CTYPE, 
"" );
            
if( (iSize<<1< iLength ) 
            

                
throw std::bad_cast( "轉(zhuǎn)換未完成" ); 
            }
 

            m_strBuf.assign( buffer.GetBufPtr() ); 
        }
 

        
operator std::string() const 
        

            
return m_strBuf; 
        }
 
    
public:
        
const std::string& ToStr() const
        
{
            
return m_strBuf;
        }

    
protected
        std::
string m_strBuf; 
    }
;


}

#endif // #ifndef _DB_STRING_CAST_H_


上面是兩個(gè)字符串轉(zhuǎn)化的程序,其實(shí)還可以?xún)?yōu)化的,只不過(guò),我很懶的,呵呵。

#pragma once

//////////////////////////////////////////////////////////////////////////
// FILE : DynLib.h
// Author : Dongbo
// Created: 2009.5.13
// Desc : Encapsulation for dynamic library! 
//////////////////////////////////////////////////////////////////////////

#include 
<string>

#include 
<Windows.h>
#include 
<tchar.h>

namespace db
{
    
class CDynLib
    
{
    
public:
        typedef       std::basic_string
< TCHAR >    string_type;
        typedef       HMODULE                       handle_type;

    
public:
        CDynLib( 
const string_type& strDynLibName );
        
~CDynLib();
    
public:
        
void       Load();
        
void       UnLoad();

        
const string_type& GetDynLibName() const;
        
void*      GetProc( const std::string& strSymbol ) const;

    
public:
        
static string_type  GetSysErrorMsg( unsigned uCode );
    
protected:
        string_type            m_strDynLibName;
        handle_type            m_hHandle;
    }
;

    inline 
const CDynLib::string_type& CDynLib::GetDynLibName() const
    
{
        
return this->m_strDynLibName;
    }

}


//////////////////////////////////////////////////////////////////////////
// FILE : DynLib.cpp
// Author : Dongbo
// Created: 2009.5.13
// Desc : Encapsulation for dynamic library! 
//////////////////////////////////////////////////////////////////////////

#ifdef __DB_USE_MFC_APPLICATION__
#include 
"stdafx.h"
#endif // #ifdef __DB_USE_MFC_APPLICATION__

#include 
"DynLib.h"

#include 
"string_cast.h"

namespace db
{
    CDynLib::CDynLib( 
const string_type& strDynLibName ) : \
        m_strDynLibName( strDynLibName ), m_hHandle( 
0 )
    
{
    }


    CDynLib::
~CDynLib()
    
{
    }


    CDynLib::string_type CDynLib::GetSysErrorMsg( unsigned uCode )
    
{
        
// 這里的uCode被定義為從GetLastError獲得的返回值
        LPVOID lpMsgBuf;
        ::FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER 
| FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            uCode,
            MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), 
            (LPTSTR)
&lpMsgBuf,
            
0,
            NULL 
            );

        string_type strMsg( (string_type::value_type
*)lpMsgBuf );
        ::LocalFree( lpMsgBuf );

        
return strMsg;
    }


    
void CDynLib::Load()
    
{
        m_hHandle 
= ::LoadLibrary( this->m_strDynLibName.c_str() );

        
if0 == m_hHandle )
        
{
            
// 因?yàn)閞untime_error不能接受wchar_t的字符串
            
// 當(dāng)系統(tǒng)使用的是char的時(shí)候,string_cast只起墊片的作用
            throw std::runtime_error( 
                
"加載動(dòng)態(tài)鏈接庫(kù):" + 
                (db::string_cast
<char>this->m_strDynLibName.c_str() )).ToStr() + 
                
"失敗,信息:" + 
                (db::string_cast
<char>( CDynLib::GetSysErrorMsg( ::GetLastError() ).c_str() )).ToStr() );
        }

    }


    
void CDynLib::UnLoad()
    
{
        
if0 != m_hHandle )
        
{
            
// 忽略卸載的錯(cuò)誤
            ::FreeLibrary( m_hHandle );
            m_hHandle 
= 0;
        }

    }


    
void* CDynLib::GetProc( const std::string& strSymbol ) const
    
{
        assert( m_hHandle 
!= 0 );

        
return (void*)::GetProcAddress( this->m_hHandle, strSymbol.c_str() );
    }

}


#pragma once

//////////////////////////////////////////////////////////////////////////
// FILE : Singleton.h
// Author : Dongbo
// Created: 2009.5.13
// Desc : Singleton template
//////////////////////////////////////////////////////////////////////////

#include 
<cassert>

namespace db
{
    template 
< typename T >
    
class Singleton
    
{
    
protected:
        
static T ms_Singleton;

    
protected:
        Singleton()
        
{
        }


        
~Singleton()
        

        }


    
public:
        
static T& GetSingleton()
        
{
            
return ms_Singleton; 
        }

        
static T* GetSingletonPtr()
        
{
            
return &ms_Singleton;
        }

    }
;
}


#pragma once

//////////////////////////////////////////////////////////////////////////
// FILE : DynLibManager.h
// Author : Dongbo
// Created: 2009.5.13
// Desc : A Manager for dynlib
//////////////////////////////////////////////////////////////////////////

#include 
"Singleton.h"
#include 
"DynLib.h"

#include 
<map>

namespace db
{
    
class CDynLibManager : public db::Singleton< CDynLibManager >
    
{
    
public:
        typedef db::Singleton
< CDynLibManager >         base_class;
        typedef db::CDynLib                             dynlib_type;
        typedef dynlib_type::string_type                string_type;
        typedef std::map
< string_type, dynlib_type* >   dynlib_container;

        typedef CDynLibManager                          my_type;
        typedef CDynLibManager
&                         my_reference;
        typedef CDynLibManager
*                         my_pointer;

        friend 
class base_class;
    
protected:
        CDynLibManager();
        
~CDynLibManager();
    
public:
        
bool  RegisterDynLib( const string_type& strDynLibName );
        
void  UnRegisterDynLib( const string_type& strDynLibName );

        
const dynlib_type&   GetDynLib( const string_type& strDynLibName ) const;        

    
protected:
        dynlib_container             m_lstDynlibs;
    }
;
}


//////////////////////////////////////////////////////////////////////////
// FILE : DynLibManager.cpp
// Author : Dongbo
// Created: 2009.5.13
// Desc : A Manager for dynlib
//////////////////////////////////////////////////////////////////////////

#ifdef __DB_USE_MFC_APPLICATION__
#include 
"stdafx.h"
#endif // #ifdef __DB_USE_MFC_APPLICATION__

#include 
"DynLibManager.h"

namespace db
{
    template
<>
    CDynLibManager Singleton
<CDynLibManager>::ms_Singleton;

    CDynLibManager::CDynLibManager()
    
{
    }


    CDynLibManager::
~CDynLibManager()
    
{
        
for( dynlib_container::iterator it = m_lstDynlibs.begin();
            it 
!= m_lstDynlibs.end();
            
++it )
        
{
            
if( it->second )
            
{
                it
->second->UnLoad();
                delete it
->second;
            }
            
        }


        m_lstDynlibs.clear();
    }


    
bool CDynLibManager::RegisterDynLib( const string_type& strDynLibName )
    
{
        
if( m_lstDynlibs.find( strDynLibName ) != m_lstDynlibs.end() )
        
{
            
return true;
        }

        
else
        
{
            
// 重新載入
            dynlib_type* pTmp = new dynlib_type(strDynLibName);
            
if!pTmp )
            
{
                
return false;
            }


            
try
            
{
                pTmp
->Load();
            }

            
catch( std::runtime_error& 
#if defined(DEBUG) || defined(_DEBUG)
                e 
#endif // #if defined(DEBUG) || defined(_DEBUG)
                )
            
{
                delete pTmp;
#if defined(DEBUG) || defined(_DEBUG)
                
throw e;
#else
                
return false;
#endif // #if defined(DEBUG) || defined(_DEBUG)
                
            }
            

            m_lstDynlibs.insert( std::make_pair( strDynLibName, pTmp ) );

            
return true;
        }

    }


    
void CDynLibManager::UnRegisterDynLib( const string_type& strDynLibName )
    
{
        dynlib_container::iterator pos 
= m_lstDynlibs.find( strDynLibName );
        
if( pos != m_lstDynlibs.end() )
        
{
            
if( pos->second )
            
{
                pos
->second->UnLoad();
                delete pos
->second;
            }


            m_lstDynlibs.erase( pos );
        }

    }


    
const CDynLibManager::dynlib_type& CDynLibManager::GetDynLib( const string_type& strDynLibName ) const
    
{
        dynlib_container::const_iterator pos 
= m_lstDynlibs.find( strDynLibName );
        
if( pos != m_lstDynlibs.end() && pos->second )
        
{
            
return *pos->second;
        }

        
else
        
{
            
throw std::runtime_error( "查找失敗!該庫(kù)可能尚未注冊(cè)!" );
        }

    }

}


       在程序中我使用這個(gè)單件Manager來(lái)管理所有的動(dòng)態(tài)載入的dll,目前還沒(méi)遇到什么問(wèn)題,當(dāng)然不能說(shuō)它沒(méi)問(wèn)題,哈哈。

for example:

#include <iostream>

using namespace std;
#include 
<tchar.h>
#include 
"DynLibManager.h"

int main()
{
    
using namespace db;

    
try
    
{
        CDynLibManager::GetSingletonPtr()
->RegisterDynLib( _T("data.dll") );

        
void *= CDynLibManager::GetSingletonPtr()->GetDynLib( _T("data.dll") ).GetProc( "QueryDataBaseInterface" );

        
if( p != NULL )
        
{
            cout
<<"加載成功!"<<endl;
        }

        
else
        
{
            cout
<<"加載失敗!"<<endl;
        }

    }

    
catch( std::runtime_error& e )
    
{
        cout
<< e.what() << endl;
    }

    

    
return 0;
}



代碼包:http://ishare.iask.sina.com.cn/f/5180214.html


       學(xué)生生涯快結(jié)束了,大學(xué)也快結(jié)束了,我對(duì)未來(lái)充滿(mǎn)了向往。我渴望新的生活,渴望新的挑戰(zhàn),渴望結(jié)識(shí)新的朋友!有朋自遠(yuǎn)方來(lái)不亦悅乎?

posted on 2009-05-24 19:03 董波 閱讀(564) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产欧美另类丝袜| 亚洲精品国产系列| 国产精品久久久久久久久久尿| 亚洲欧美一区二区原创| 亚洲精品你懂的| 欧美大片国产精品| 亚洲欧洲日产国产综合网| 亚洲精品视频免费| 亚洲一区免费| 久久人91精品久久久久久不卡| 久色婷婷小香蕉久久| 欧美xx视频| 欧美午夜一区| 激情综合在线| 日韩午夜av在线| 欧美一区二区三区在线播放| 噜噜爱69成人精品| 亚洲精品久久久一区二区三区| 亚洲一区二区三区四区五区黄| 欧美一级夜夜爽| 欧美激情视频在线播放| 国产精品一页| 日韩亚洲不卡在线| 午夜精品视频在线观看| 免费亚洲电影在线| 亚洲一区一卡| 欧美高清在线观看| 国产亚洲精品一区二555| 日韩一级黄色片| 老牛国产精品一区的观看方式| 日韩一区二区精品葵司在线| 久久亚洲捆绑美女| 国产女精品视频网站免费| 亚洲理论电影网| 久久艳片www.17c.com| 亚洲少妇最新在线视频| 欧美a一区二区| 国产在线精品一区二区夜色| 亚洲午夜精品网| 亚洲国产成人久久| 久久琪琪电影院| 国产主播精品| 久久精品国产99国产精品| 在线综合亚洲| 欧美午夜不卡视频| 一区二区三区欧美视频| 亚洲国产91色在线| 美女成人午夜| 亚洲国产高清自拍| 免费成人网www| 久久精品视频在线观看| 国产一区清纯| 久久网站热最新地址| 久久成人免费日本黄色| 国产一区欧美| 美国十次了思思久久精品导航| 久久经典综合| 在线免费观看日本一区| 欧美成人久久| 欧美在线视频一区二区三区| 国产精品高潮呻吟| 一区二区三区免费观看| 亚洲另类一区二区| 欧美日韩国产另类不卡| 亚洲伦理在线免费看| 欧美成人黑人xx视频免费观看| 久久精品国产96久久久香蕉| 好吊妞**欧美| 欧美成人精品在线视频| 欧美xxx成人| 亚洲最新在线视频| 一区二区三区欧美激情| 国产精品自在在线| 久久视频精品在线| 免费久久99精品国产自在现线| 亚洲欧洲日韩在线| 亚洲免费av电影| 国产精品尤物福利片在线观看| 久久国产精品久久久久久久久久| 欧美一区二区三区在线视频| 又紧又大又爽精品一区二区| 亚洲国产精品第一区二区| 欧美日韩综合视频网址| 欧美一级淫片aaaaaaa视频| 欧美在线观看你懂的| 亚洲精美视频| 99xxxx成人网| 狠狠色综合日日| 亚洲国产欧美国产综合一区 | 国产精品一区二区三区四区五区| 欧美亚洲一区二区在线观看| 久久精品综合网| 99视频在线观看一区三区| 亚洲图片欧美日产| 亚洲国产日韩综合一区| 制服丝袜亚洲播放| 在线成人亚洲| 亚洲免费一在线| 日韩一级在线观看| 欧美在线播放一区| 亚洲深爱激情| 快射av在线播放一区| 亚洲免费在线观看视频| 牛牛精品成人免费视频| 久久福利资源站| 欧美日韩三级视频| 免费观看成人| 国产欧美日韩一级| 亚洲人精品午夜| 精品成人a区在线观看| 在线午夜精品自拍| 99ri日韩精品视频| 榴莲视频成人在线观看| 久久国产精品一区二区三区四区 | 亚洲精品日韩在线| 久久精品国产综合| 日韩视频不卡| 亚洲第一页自拍| 亚洲综合色在线| 亚洲精品小视频在线观看| 欧美一级专区| 午夜精品视频网站| 欧美三级视频在线播放| 亚洲成人在线网| 亚洲第一狼人社区| 久久se精品一区精品二区| 亚洲免费小视频| 欧美色123| 日韩午夜免费| 一区二区欧美视频| 欧美久色视频| 亚洲精品乱码久久久久久黑人 | 一区二区三区国产在线观看| 日韩视频二区| 欧美激情一二区| 亚洲国产91精品在线观看| 亚洲电影免费| 久久人人看视频| 欧美成人亚洲| 亚洲人体一区| 欧美精品aa| 亚洲精品麻豆| 一区二区三区黄色| 国产精品wwwwww| 亚洲欧美精品在线观看| 久久成人综合网| 激情久久五月| 牛牛精品成人免费视频| 亚洲精品一区二区三区av| 一区二区三区.www| 国产精品草莓在线免费观看| 亚洲一品av免费观看| 香蕉av福利精品导航| 国产亚洲a∨片在线观看| 久久激情综合| 亚洲人成免费| 亚洲免费网址| 狠狠色丁香婷婷综合| 麻豆国产精品va在线观看不卡| 亚洲韩国精品一区| 性伦欧美刺激片在线观看| 国产日韩精品在线播放| 久久久噜噜噜久噜久久| 亚洲日本中文字幕区| 午夜精品久久久久久久白皮肤| 国产欧美一区二区三区在线看蜜臀 | 欧美亚洲午夜视频在线观看| 久久婷婷国产综合国色天香| 亚洲国产精品视频| 欧美日韩直播| 久久久爽爽爽美女图片| 99ri日韩精品视频| 麻豆精品传媒视频| 亚洲宅男天堂在线观看无病毒| 精品av久久久久电影| 国产精品成人国产乱一区| 快播亚洲色图| 午夜精品一区二区在线观看 | 日韩亚洲国产精品| 国产精品一区二区a| 老司机久久99久久精品播放免费| 亚洲激情偷拍| 久久久国产精品一区二区中文 | 欧美成人免费网站| 午夜欧美不卡精品aaaaa| 曰韩精品一区二区| 国产精品日韩久久久久| 欧美国产综合一区二区| 欧美在线观看视频| 亚洲图片在线| 亚洲欧洲一区二区在线播放| 欧美一区午夜精品| 一区二区日韩免费看| 亚洲国产高清自拍| 国内在线观看一区二区三区| 国产精品免费一区豆花| 欧美视频网址| 欧美另类高清视频在线| 欧美jizz19性欧美| 老司机精品久久|