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

yehao's Blog

C/C++內(nèi)存泄漏及檢測(cè)

“該死系統(tǒng)存在內(nèi)存泄漏問(wèn)題”,項(xiàng)目中由于各方面因素,總是有人抱怨存在內(nèi)存泄漏,系統(tǒng)長(zhǎng)時(shí)間運(yùn)行之后,可用內(nèi)存越來(lái)越少,甚至導(dǎo)致了某些服務(wù)失敗。內(nèi)存泄漏是最難發(fā)現(xiàn)的常見(jiàn)錯(cuò)誤之一,因?yàn)槌怯猛陜?nèi)存或調(diào)用malloc失敗,否則都不會(huì)導(dǎo)致任何問(wèn)題。實(shí)際上,使用C/C++這類沒(méi)有垃圾回收機(jī)制的語(yǔ)言時(shí),你很多時(shí)間都花在處理如何正確釋放內(nèi)存上。如果程序運(yùn)行時(shí)間足夠長(zhǎng),如后臺(tái)進(jìn)程運(yùn)行在服務(wù)器上,只要服務(wù)器不宕機(jī)就一直運(yùn)行,一個(gè)小小的失誤也會(huì)對(duì)程序造成重大的影響,如造成某些關(guān)鍵服務(wù)失敗。

對(duì)于內(nèi)存泄漏,本人深有體會(huì)!實(shí)習(xí)的時(shí)候,公司一個(gè)項(xiàng)目中就存在內(nèi)存泄漏問(wèn)題,項(xiàng)目的代碼兩非常大,后臺(tái)進(jìn)程也比較多,造成內(nèi)存泄漏的地方比較難找。這次機(jī)會(huì)是我對(duì)如何查找內(nèi)存泄漏問(wèn)題,有了一定的經(jīng)驗(yàn),后面自己的做了相關(guān)實(shí)驗(yàn),在此我分享一下內(nèi)存泄漏如何調(diào)試查找,主要內(nèi)容如下:

  • 1、內(nèi)存泄漏簡(jiǎn)介
  • 2、Windows平臺(tái)下的內(nèi)存泄漏檢測(cè)
    • 2.1、檢測(cè)是否存在內(nèi)存泄漏問(wèn)題
    • 2.2、定位具體的內(nèi)存泄漏地方
  • 3、Linux平臺(tái)下的內(nèi)存泄漏檢測(cè) 
  • 4、總結(jié)

其實(shí)Windows、Linux下面的內(nèi)存檢測(cè)都可以單獨(dú)開(kāi)篇詳細(xì)介紹,方法和工具也遠(yuǎn)遠(yuǎn)不止文中介紹到的,我的方法也不是最優(yōu)的,如果您有更好的方法,也請(qǐng)您告訴我和大家。

1、內(nèi)存泄漏簡(jiǎn)介及后果

wikipedia中這樣定義內(nèi)存泄漏:在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,導(dǎo)致在釋放該段內(nèi)存之前就失去了對(duì)該段內(nèi)存的控制,從而造成了內(nèi)存的浪費(fèi)。

最難捉摸也最難檢測(cè)到的錯(cuò)誤之一是內(nèi)存泄漏,即未能正確釋放以前分配的內(nèi)存的 bug。 只發(fā)生一次的小的內(nèi)存泄漏可能不會(huì)被注意,但泄漏大量?jī)?nèi)存的程序或泄漏日益增多的程序可能會(huì)表現(xiàn)出各種征兆:從性能不良(并且逐漸降低)到內(nèi)存完全用盡。 更糟的是,泄漏的程序可能會(huì)用掉太多內(nèi)存,以致另一個(gè)程序失敗,而使用戶無(wú)從查找問(wèn)題的真正根源。 此外,即使無(wú)害的內(nèi)存泄漏也可能是其他問(wèn)題的征兆。

內(nèi)存泄漏會(huì)因?yàn)闇p少可用內(nèi)存的數(shù)量從而降低計(jì)算機(jī)的性能。最終,在最糟糕的情況下,過(guò)多的可用內(nèi)存被分配掉導(dǎo)致全部或部分設(shè)備停止正常工作,或者應(yīng)用程序崩潰。內(nèi)存泄漏可能不嚴(yán)重,甚至能夠被常規(guī)的手段檢測(cè)出來(lái)。在現(xiàn)代操作系統(tǒng)中,一個(gè)應(yīng)用程序使用的常規(guī)內(nèi)存在程序終止時(shí)被釋放。這表示一個(gè)短暫運(yùn)行的應(yīng)用程序中的內(nèi)存泄漏不會(huì)導(dǎo)致嚴(yán)重后果。

在以下情況,內(nèi)存泄漏導(dǎo)致較嚴(yán)重的后果:

  • 程序運(yùn)行后置之不理,并且隨著時(shí)間的流失消耗越來(lái)越多的內(nèi)存(比如服務(wù)器上的后臺(tái)任務(wù),尤其是嵌入式系統(tǒng)中的后臺(tái)任務(wù),這些任務(wù)可能被運(yùn)行后很多年內(nèi)都置之不理);
  • 新的內(nèi)存被頻繁地分配,比如當(dāng)顯示電腦游戲或動(dòng)畫(huà)視頻畫(huà)面時(shí);
  • 程序能夠請(qǐng)求未被釋放的內(nèi)存(比如共享內(nèi)存),甚至是在程序終止的時(shí)候;
  • 泄漏在操作系統(tǒng)內(nèi)部發(fā)生;
  • 泄漏在系統(tǒng)關(guān)鍵驅(qū)動(dòng)中發(fā)生;
  • 內(nèi)存非常有限,比如在嵌入式系統(tǒng)或便攜設(shè)備中;
  • 當(dāng)運(yùn)行于一個(gè)終止時(shí)內(nèi)存并不自動(dòng)釋放的操作系統(tǒng)(比如AmigaOS)之上,而且一旦丟失只能通過(guò)重啟來(lái)恢復(fù)。

下面我們通過(guò)以下例子來(lái)介紹如何檢測(cè)內(nèi)存泄漏問(wèn)題:

01 #include <stdlib.h>
02 #include <iostream>
03 using namespace std;
04   
05 void GetMemory(char *p, int num)
06 {
07     p = (char*)malloc(sizeof(char) * num);//使用new也能夠檢測(cè)出來(lái)
08 }
09   
10 int main(int argc,char** argv)
11 {
12     char *str = NULL;
13     GetMemory(str, 100);
14     cout<<"Memory leak test!"<<endl;
15     //如果main中存在while循環(huán)調(diào)用GetMemory
16     //那么問(wèn)題將變得很嚴(yán)重
17     //while(1){GetMemory(...);}
18     return 0;
19 }

實(shí)際中不可能這么簡(jiǎn)單,如果這么簡(jiǎn)單也用不著別的方法,程序員一眼就可以看出問(wèn)題,此程序只用于測(cè)試。

2、Windows平臺(tái)下的內(nèi)存泄漏檢測(cè)

2.1、檢測(cè)是否存在內(nèi)存泄漏問(wèn)題

Windows平臺(tái)下面Visual Studio 調(diào)試器和 C 運(yùn)行時(shí) (CRT) 庫(kù)為我們提供了檢測(cè)和識(shí)別內(nèi)存泄漏的有效方法,原理大致如下:內(nèi)存分配要通過(guò)CRT在運(yùn)行時(shí)實(shí)現(xiàn),只要在分配內(nèi)存和釋放內(nèi)存時(shí)分別做好記錄,程序結(jié)束時(shí)對(duì)比分配內(nèi)存和釋放內(nèi)存的記錄就可以確定是不是有內(nèi)存泄漏。在vs中啟用內(nèi)存檢測(cè)的方法如下:

  • STEP1,在程序中包括以下語(yǔ)句: (#include 語(yǔ)句必須采用上文所示順序。 如果更改了順序,所使用的函數(shù)可能無(wú)法正常工作。)
1 #define _CRTDBG_MAP_ALLOC
2 #include <stdlib.h>
3 #include <crtdbg.h>

通過(guò)包括 crtdbg.h,將 mallocfree 函數(shù)映射到它們的調(diào)試版本,即 _malloc_dbg_free_dbg,這兩個(gè)函數(shù)將跟蹤內(nèi)存分配和釋放。 此映射只在調(diào)試版本(在其中定義了_DEBUG)中發(fā)生。 發(fā)布版本使用普通的 mallocfree 函數(shù)。

#define 語(yǔ)句將 CRT 堆函數(shù)的基版本映射到對(duì)應(yīng)的“Debug”版本。 并非絕對(duì)需要該語(yǔ)句;但如果沒(méi)有該語(yǔ)句,內(nèi)存泄漏轉(zhuǎn)儲(chǔ)包含的有用信息將較少。

  • STEP2, 在添加了上述語(yǔ)句之后,可以通過(guò)在程序中包括以下語(yǔ)句(通常應(yīng)恰好放在程序退出位置之前)來(lái)轉(zhuǎn)儲(chǔ)內(nèi)存泄漏信息:
1 _CrtDumpMemoryLeaks();

此時(shí),完整的代碼如下:

當(dāng)在調(diào)試器下運(yùn)行程序時(shí),_CrtDumpMemoryLeaks 將在“輸出”窗口中顯示內(nèi)存泄漏信息。 內(nèi)存泄漏信息如下所示:

image

如果沒(méi)有使用 #define _CRTDBG_MAP_ALLOC 語(yǔ)句,內(nèi)存泄漏轉(zhuǎn)儲(chǔ)將如下所示:

image

未定義 _CRTDBG_MAP_ALLOC 時(shí),所顯示的會(huì)是:

  • 內(nèi)存分配編號(hào)(在大括號(hào)內(nèi))。

  • 塊類型(普通、客戶端或 CRT)。

  • “普通塊”是由程序分配的普通內(nèi)存。

  • “客戶端塊”是由 MFC 程序用于需要析構(gòu)函數(shù)的對(duì)象的特殊類型內(nèi)存塊。 MFC new 操作根據(jù)正在創(chuàng)建的對(duì)象的需要?jiǎng)?chuàng)建普通塊或客戶端塊。

  • “CRT 塊”是由 CRT 庫(kù)為自己使用而分配的內(nèi)存塊。 CRT 庫(kù)處理這些塊的釋放,因此您不大可能在內(nèi)存泄漏報(bào)告中看到這些塊,除非出現(xiàn)嚴(yán)重錯(cuò)誤(例如 CRT 庫(kù)損壞)。

從不會(huì)在內(nèi)存泄漏信息中看到下面兩種塊類型:

  • “可用塊”是已釋放的內(nèi)存塊。

  • “忽略塊”是您已特別標(biāo)記的塊,因而不出現(xiàn)在內(nèi)存泄漏報(bào)告中。

  • 十六進(jìn)制形式的內(nèi)存位置。

  • 以字節(jié)為單位的塊大小。

  • 前 16 字節(jié)的內(nèi)容(亦為十六進(jìn)制)。

定義了 _CRTDBG_MAP_ALLOC 時(shí),還會(huì)顯示在其中分配泄漏的內(nèi)存的文件。 文件名后括號(hào)中的數(shù)字(本示例中為 10)是該文件中的行號(hào)。

注意:如果程序總是在同一位置退出,調(diào)用 _CrtDumpMemoryLeaks 將非常容易。 如果程序從多個(gè)位置退出,則無(wú)需在每個(gè)可能退出的位置放置對(duì) _CrtDumpMemoryLeaks 的調(diào)用,而可以在程序開(kāi)始處包含以下調(diào)用:

該語(yǔ)句在程序退出時(shí)自動(dòng)調(diào)用 _CrtDumpMemoryLeaks。 必須同時(shí)設(shè)置 _CRTDBG_ALLOC_MEM_DF_CRTDBG_LEAK_CHECK_DF 兩個(gè)位域,如前面所示。

2.2、定位具體的內(nèi)存泄漏地方

通過(guò)上面的方法,我們幾乎可以定位到是哪個(gè)地方調(diào)用內(nèi)存分配函數(shù)malloc和new等,如上例中的GetMemory函數(shù)中,即第10行!但是不能定位到,在哪個(gè)地方調(diào)用GetMemory()導(dǎo)致的內(nèi)存泄漏,而且在大型項(xiàng)目中可能有很多處調(diào)用GetMemory。如何要定位到在哪個(gè)地方調(diào)用GetMemory導(dǎo)致的內(nèi)存泄漏?

定位內(nèi)存泄漏的另一種技術(shù)涉及在關(guān)鍵點(diǎn)對(duì)應(yīng)用程序的內(nèi)存狀態(tài)拍快照。 CRT 庫(kù)提供一種結(jié)構(gòu)類型 _CrtMemState,您可用它存儲(chǔ)內(nèi)存狀態(tài)的快照:

1 _CrtMemState s1, s2, s3;

若要在給定點(diǎn)對(duì)內(nèi)存狀態(tài)拍快照,請(qǐng)向 _CrtMemCheckpoint 函數(shù)傳遞 _CrtMemState 結(jié)構(gòu)。 該函數(shù)用當(dāng)前內(nèi)存狀態(tài)的快照填充此結(jié)構(gòu):

1 _CrtMemCheckpoint( &s1 );

通過(guò)向 _CrtMemDumpStatistics 函數(shù)傳遞 _CrtMemState 結(jié)構(gòu),可以在任意點(diǎn)轉(zhuǎn)儲(chǔ)該結(jié)構(gòu)的內(nèi)容:

1 _CrtMemDumpStatistics( &s1 );

若要確定代碼中某一部分是否發(fā)生了內(nèi)存泄漏,可以在該部分之前和之后對(duì)內(nèi)存狀態(tài)拍快照,然后使用 _CrtMemDifference 比較這兩個(gè)狀態(tài):

1 _CrtMemCheckpoint( &s1 );
2 // memory allocations take place here
3 _CrtMemCheckpoint( &s2 );
4   
5 if ( _CrtMemDifference( &s3, &s1, &s2) )
6    _CrtMemDumpStatistics( &s3 );

顧名思義,_CrtMemDifference 比較兩個(gè)內(nèi)存狀態(tài)(s1 和 s2),生成這兩個(gè)狀態(tài)之間差異的結(jié)果(s3)。 在程序的開(kāi)始和結(jié)尾放置 _CrtMemCheckpoint 調(diào)用,并使用_CrtMemDifference 比較結(jié)果,是檢查內(nèi)存泄漏的另一種方法。 如果檢測(cè)到泄漏,則可以使用 _CrtMemCheckpoint 調(diào)用通過(guò)二進(jìn)制搜索技術(shù)來(lái)劃分程序和定位泄漏。

如上面的例子程序我們可以這樣來(lái)定位確切的調(diào)用GetMemory的地方:

調(diào)試時(shí),程序輸出如下結(jié)果:

image

這說(shuō)明在s1和s2之間存在內(nèi)存泄漏!??!如果GetMemory不是在s1和s2之間調(diào)用,那么就不會(huì)有信息輸出。

3、Linux平臺(tái)下的內(nèi)存泄漏檢測(cè)

在上面我們介紹了,vs中在代碼中“包含crtdbg.h,將 mallocfree 函數(shù)映射到它們的調(diào)試版本,即 _malloc_dbg_free_dbg,這兩個(gè)函數(shù)將跟蹤內(nèi)存分配和釋放。 此映射只在調(diào)試版本(在其中定義了_DEBUG)中發(fā)生。 發(fā)布版本使用普通的 mallocfree 函數(shù)。”即為malloc和free做了鉤子,用于記錄內(nèi)存分配信息。

Linux下面也有原理相同的方法——mtrace,http://en.wikipedia.org/wiki/Mtrace。方法類似,我這就不具體描述,參加給出的鏈接。這節(jié)我主要介紹一個(gè)非常強(qiáng)大的工具valgrind。如下圖所示:

image

如上圖所示知道:

==6118== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1
==6118==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
==6118==    by 0x8048724: GetMemory(char*, int) (in /home/netsky/workspace/a.out)
==6118==    by 0x804874E: main (in /home/netsky/workspace/a.out)

是在main中調(diào)用了GetMemory導(dǎo)致的內(nèi)存泄漏,GetMemory中是調(diào)用了malloc導(dǎo)致泄漏了100字節(jié)的內(nèi)存。

Things to notice:
• There is a lot of information in each error message; read it carefully.
• The 6118 is the process ID; it’s usually unimportant.
• The ?rst line ("Heap Summary") tells you what kind of error it is.
• Below the ?rst line is a stack trace telling you where the problem occurred. Stack traces can get quite large, and be
confusing, especially if you are using the C++ STL. Reading them from the bottom up can help.

• The code addresses (eg. 0x4024F20) are usually unimportant, but occasionally crucial for tracking down weirder
bugs.

The stack trace tells you where the leaked memory was allocated. Memcheck cannot tell you why the memory leaked,
unfortunately. (Ignore the "vg_replace_malloc.c", that’s an implementation detail.)
There are several kinds of leaks; the two most important categories are:
• "de?nitely lost": your program is leaking memory -- ?x it!
• "probably lost": your program is leaking memory, unless you’re doing funny things with pointers (such as moving
them to point to the middle of a heap block)

Valgrind的使用請(qǐng)見(jiàn)手冊(cè)http://valgrind.org/docs/manual/manual.html。

4、總結(jié)

其實(shí)內(nèi)存泄漏的原因可以概括為:調(diào)用了malloc/new等內(nèi)存申請(qǐng)的操作,但缺少了對(duì)應(yīng)的free/delete,總之就是,malloc/new比f(wàn)ree/delete的數(shù)量多。我們?cè)诰幊虝r(shí)需要注意這點(diǎn),保證每個(gè)malloc都有對(duì)應(yīng)的free,每個(gè)new都有對(duì)應(yīng)的deleted?。?!平時(shí)要養(yǎng)成這樣一個(gè)好的習(xí)慣。

要避免內(nèi)存泄漏可以總結(jié)為以下幾點(diǎn):

  • 程序員要養(yǎng)成良好習(xí)慣,保證malloc/new和free/delete匹配;
  • 檢測(cè)內(nèi)存泄漏的關(guān)鍵原理就是,檢查malloc/new和free/delete是否匹配,一些工具也就是這個(gè)原理。要做到這點(diǎn),就是利用宏或者鉤子,在用戶程序與運(yùn)行庫(kù)之間加了一層,用于記錄內(nèi)存分配情況。


作者:吳秦
出處:http://www.cnblogs.com/skynet/

posted on 2011-10-10 14:59 厚積薄發(fā) 閱讀(328) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++

導(dǎo)航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計(jì)

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产伦精品一区二区三区高清版| 99综合精品| 在线视频精品一区| 亚洲精品一品区二品区三品区| 亚洲狠狠婷婷| 亚洲美女av电影| 国产精品另类一区| 国产精品欧美久久| 国产精品一区二区三区成人| 国产美女一区| 亚洲第一精品夜夜躁人人爽| 日韩西西人体444www| 亚洲欧美日韩另类精品一区二区三区| 欧美影院成人| 欧美激情精品久久久| 一区二区三区 在线观看视频| 先锋影音久久久| 欧美电影美腿模特1979在线看| 欧美午夜影院| 亚洲黄网站黄| 久久精品国产亚洲aⅴ| 亚洲国产网站| 亚洲自拍偷拍色片视频| 免费成人网www| 国产日韩高清一区二区三区在线| 亚洲精品免费在线播放| 欧美一区亚洲| 一本久道久久综合中文字幕| 久久综合久久综合这里只有精品| 国产精品久久久久9999| 日韩午夜高潮| 亚洲电影免费在线| 亚洲男女毛片无遮挡| 亚洲欧美中日韩| 欧美大学生性色视频| 羞羞答答国产精品www一本| 欧美国产成人精品| 在线精品视频在线观看高清| 欧美在线视频a| 9国产精品视频| 欧美凹凸一区二区三区视频| 激情一区二区三区| 久久精品最新地址| 亚洲男同1069视频| 国产精品乱码一区二区三区 | 蜜臀av一级做a爰片久久| 国产欧美视频在线观看| 亚洲欧美国产毛片在线| 日韩一区二区久久| 欧美激情综合五月色丁香| 亚洲丶国产丶欧美一区二区三区| 性欧美暴力猛交另类hd| 亚洲一区高清| 国产欧美精品一区| 久久爱www.| 午夜精彩视频在线观看不卡| 国产女人精品视频| 欧美在线视频全部完| 亚洲欧美日韩国产中文| 国产欧美日韩综合一区在线播放| 久久成人av少妇免费| 午夜精品久久久久久| 久久精品亚洲| 午夜久久一区| 亚洲综合精品自拍| 国产精品爽爽ⅴa在线观看| 欧美影片第一页| 久久九九精品| 亚洲日本黄色| 亚洲精品乱码久久久久久日本蜜臀| 欧美激情 亚洲a∨综合| 一区二区欧美激情| 亚洲男同1069视频| 亚洲国产美女| 夜夜嗨av色综合久久久综合网| 国产精品国产| 久久综合福利| 欧美精品一区二区三区很污很色的| 亚洲久久视频| 亚洲欧美精品中文字幕在线| 黄色一区二区在线| 亚洲精品免费在线播放| 国产美女诱惑一区二区| 免费在线观看精品| 欧美日韩一区二区在线观看| 欧美日韩一区二区在线播放| 亚洲欧美日韩另类| 久久亚洲捆绑美女| 亚洲一区成人| 久久九九免费视频| 亚洲视频每日更新| 久久精品99久久香蕉国产色戒| 亚洲精品在线电影| 亚洲男人的天堂在线| 亚洲欧洲一区二区在线观看| a4yy欧美一区二区三区| 国产一区二区三区自拍| 亚洲国产精品电影在线观看| 国产精品日韩一区| 亚洲国产精品成人| 国产一区二区丝袜高跟鞋图片 | 国产欧美精品| 亚洲娇小video精品| 国产日韩精品久久久| 亚洲国产精品va在线看黑人| 国产欧美亚洲视频| 亚洲啪啪91| 亚洲国产乱码最新视频| 欧美在线关看| 午夜久久黄色| 欧美午夜电影网| 亚洲激情一区| 亚洲国产精品成人一区二区| 亚洲欧美日韩区| 亚洲一级黄色av| 欧美精品三级日韩久久| 亚洲电影在线播放| 在线观看视频欧美| 欧美专区第一页| 欧美在线免费视屏| 国产精品日韩二区| 亚洲视频综合| 午夜精品亚洲| 国产精品久久久| 国产精品白丝黑袜喷水久久久| 国产综合一区二区| 亚洲免费一区二区| 亚洲网站啪啪| 欧美日韩一区二区三| 亚洲日本在线观看| 夜夜嗨av一区二区三区四区| 欧美国产乱视频| 亚洲人成人一区二区在线观看| 亚洲精品视频中文字幕| 欧美大片在线影院| 亚洲青涩在线| 亚洲在线视频免费观看| 国产精品一卡| 久久精品国产第一区二区三区| 久久天堂国产精品| 在线观看亚洲一区| 开心色5月久久精品| 欧美激情综合色| 99精品欧美一区二区三区| 欧美日韩亚洲一区二区| 一区二区欧美在线| 久久精品官网| 亚洲国产综合视频在线观看| 欧美猛交免费看| 日韩视频在线观看国产| 先锋影音久久久| 红桃视频欧美| 欧美成人在线影院| 亚洲视频视频在线| 久久久天天操| av成人免费在线| 国产精品三级视频| 巨胸喷奶水www久久久免费动漫| 亚洲精品视频啊美女在线直播| 亚洲欧美日韩一区在线观看| 黄网站免费久久| 欧美视频在线视频| 久久久国产精品一区| 亚洲欧洲日产国产综合网| 午夜精品久久久久久久久| 在线观看成人av| 国产精品二区在线| 欧美亚洲网站| 欧美激情欧美激情在线五月| 亚洲一区二三| 亚洲欧洲在线免费| 国产乱码精品一区二区三区忘忧草| 另类欧美日韩国产在线| 亚洲一级在线观看| 亚洲二区精品| 久久精品午夜| 亚洲一区欧美激情| 亚洲电影免费在线观看| 国产美女一区二区| 欧美日韩色综合| 久久综合色影院| 香蕉尹人综合在线观看| 亚洲人成在线观看网站高清| 午夜一区二区三区不卡视频| 亚洲欧洲在线一区| 国产真实乱偷精品视频免| 欧美久久久久久久| 久久三级视频| 欧美在线亚洲综合一区| 亚洲少妇诱惑| 亚洲日本中文字幕免费在线不卡| 另类人畜视频在线| 久久精品成人一区二区三区| 亚洲图片欧美一区| 亚洲三级免费观看| 在线观看一区二区视频| 国产亚洲人成a一在线v站| 国产精品久久久久久影视| 亚洲国产一区二区三区青草影视 | 欧美在线观看视频在线|