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

踩坑記錄:C++17 的 string_view 導(dǎo)致異步日志亂碼的深度剖析

開(kāi)發(fā)
今天,我就用這個(gè)真實(shí)案例,帶大家深入理解這個(gè)非常經(jīng)典的 C++ 內(nèi)存陷阱問(wèn)題。相信看完這篇文章,你對(duì) string_view 和移動(dòng)語(yǔ)義的理解會(huì)更上一層樓!

最近在我的付費(fèi)教學(xué)項(xiàng)目 MiniSpdlog 高性能日志庫(kù)實(shí)戰(zhàn) 中,一位細(xì)心的學(xué)員發(fā)現(xiàn)了一個(gè)非常有意思的 bug:

"小康哥,我把 common.h 中的 string_view_t 從 std::string 改成 std::string_view 后,同步日志一切正常,但異步日志全都變成亂碼了!這是為什么?"

看到這個(gè)問(wèn)題,我第一反應(yīng)是:這是一個(gè)非常經(jīng)典的 C++ 內(nèi)存陷阱! 這個(gè)問(wèn)題涉及到:

  • string_view 的本質(zhì)
  • 移動(dòng)語(yǔ)義的深層理解
  • 異步編程中的內(nèi)存生命周期管理

今天,我就用這個(gè)真實(shí)案例,帶大家深入理解這個(gè)問(wèn)題。相信看完這篇文章,你對(duì) string_view 和移動(dòng)語(yǔ)義的理解會(huì)更上一層樓!

問(wèn)題復(fù)現(xiàn)

(1) 觸發(fā)條件

修改 common.h:

// 原來(lái)的定義(沒(méi)問(wèn)題)
using string_view_t = std::string;

// 改成(異步模式亂碼)
using string_view_t = std::string_view;

(2) 異常表現(xiàn)

同步日志(正常):

[2025-10-20 21:16:09] [I] Thread 0 - Message #0
[2025-10-20 21:16:09] [I] Thread 1 - Message #1
[2025-10-20 21:16:09] [I] Thread 2 - Message #2

異步日志(亂碼):

[2025-10-20 21:16:09] [I] ??ge #1
[2025-10-20 21:16:09] [I] ??ge #1
[2025-10-20 21:16:09] [I] ??ge #1

為什么同步?jīng)]問(wèn)題,異步就亂碼了?讓我們開(kāi)始調(diào)查!

第一步:初步診斷

我讓學(xué)員加了一些調(diào)試代碼,在 log_msg_buffer 的構(gòu)造函數(shù)中打印內(nèi)存地址:

explicit log_msg_buffer(const log_msg& msg)
    : log_msg(msg)
    , buffer(msg.payload.data(), msg.payload.size())
{
    std::cout << "Original payload: " << (void*)msg.payload.data() 
              << " size: " << msg.payload.size() << std::endl;
    std::cout << "Buffer address: " << (void*)buffer.data() 
              << " size: " << buffer.size() << std::endl;
    
    payload = string_view_t(buffer.data(), buffer.size());
    
    std::cout << "New payload: " << (void*)payload.data() 
              << " size: " << payload.size() << std::endl;
    std::cout << "Content: " << std::string(payload) << std::endl;
}

輸出結(jié)果:

Original payload: 0x7f580f62db60 size: 21
Buffer address: 0x7f5808000b60 size: 21
New payload: 0x7f5808000b60 size: 21
Content: Thread 0 - Message #0

看起來(lái)一切正常?數(shù)據(jù)被正確深拷貝了,payload 也指向了新的 buffer。那問(wèn)題出在哪里呢?

這就是這個(gè) bug 的狡猾之處——問(wèn)題不在構(gòu)造,而在移動(dòng)!

第二步:抓住真兇——移動(dòng)語(yǔ)義的陷阱

讓我們跟蹤一下異步日志的完整流程:

// 1. 用戶(hù)線程調(diào)用
logger->info("Thread {} - Message #{}", t, i);

// 2. 在 logger::log() 中格式化
fmt::memory_buffer buf;  // 棧上的臨時(shí)變量
fmt::format_to(std::back_inserter(buf), fmt, args...);

// 3. 創(chuàng)建 log_msg
log_msg msg(name_, lvl, string_view_t(buf.data(), buf.size()));
//                       ^^^^^^^^^^^^^^ 指向棧上的 buf!

// 4.調(diào)用異步 logger 的 sink_it_()
async_logger::sink_it_(msg);

在 async_logger::sink_it_() 中:

void async_logger::sink_it_(const log_msg& msg) {
    // 5. 創(chuàng)建 async_msg,深拷貝 payload
    async_msg async_m(async_msg_type::log, shared_from_this(), msg);
    // 此時(shí):async_m.buffer 存儲(chǔ)了 "Thread 0 - Message #0"
    //      async_m.payload 指向 async_m.buffer
    
    // 6. 將消息移動(dòng)到隊(duì)列(關(guān)鍵!)
    pool_ptr->post_log(shared_from_this(), msg);
        └─> q_.enqueue(std::move(async_m));
            └─> v_[tail_] = std::move(item);  // ? 問(wèn)題就在這里!
}
// 7. 函數(shù)返回,async_m 被析構(gòu)

關(guān)鍵問(wèn)題: 在步驟 6 中,async_m 被移動(dòng)到隊(duì)列的 v_[tail_] 中。如果沒(méi)有正確的移動(dòng)賦值運(yùn)算符,會(huì)發(fā)生什么?

第三步:深入理解——用內(nèi)存圖說(shuō)話

(1) 數(shù)據(jù)結(jié)構(gòu)回顧

struct log_msg_buffer : log_msg {
    std::string buffer;              // 實(shí)際存儲(chǔ)數(shù)據(jù)
    string_view_t payload;           // 指向 buffer(繼承自 log_msg)
};

關(guān)鍵理解:

  • std::string buffer 是擁有者,管理堆上的內(nèi)存
  • string_view payload 只是觀察者,存儲(chǔ)指針 + 長(zhǎng)度

用圖示表示:

┌─────────────────────────────┐
│ log_msg_buffer 對(duì)象         │
│                             │
│  payload (string_view)      │
│  ┌─────────────────┐        │
│  │ ptr  = 0x1000   │────┐   │
│  │ len  = 21       │    │   │
│  └─────────────────┘    │   │
│                         │   │
│  buffer (std::string)   │   │
│  ┌─────────────────┐    │   │
│  │ data = 0x1000   │────┘   │
│  │ size = 21       │        │
│  └─────────────────┘        │
└─────────────────────────────┘
         │
         ▼
    堆內(nèi)存 (0x1000):
    "Thread 0 - Message #0"

(2) 移動(dòng)過(guò)程的問(wèn)題

① 沒(méi)有自定義移動(dòng)賦值(出問(wèn)題的情況)

編譯器生成的默認(rèn)移動(dòng)賦值:

log_msg_buffer& operator=(log_msg_buffer&& other) {
    // 1. 移動(dòng) buffer(正確)
    this->buffer = std::move(other.buffer);
    
    // 2. 拷貝 payload(錯(cuò)誤!)
    this->payload = other.payload;  // 只拷貝了指針值!
    
    return *this;
}

移動(dòng)前的內(nèi)存狀態(tài):

棧上的 async_m:                    隊(duì)列中的 v_[tail_]:
┌──────────────────┐              ┌──────────────────┐
│ payload.ptr      │              │ payload.ptr      │
│  = 0x1000 ───┐   │              │  = ??????        │
│              │   │              │                  │
│ buffer       │   │              │ buffer (空)      │
│  data = 0x1000   │              │                  │
└──────────────┼───┘              └──────────────────┘
               │
               ▼
          堆內(nèi)存 0x1000:
     "Thread 0 - Message #0"

執(zhí)行 v_[tail_] = std::move(async_m) 后:

棧上的 async_m:                    隊(duì)列中的 v_[tail_]:
┌──────────────────┐              ┌──────────────────┐
│ payload.ptr      │              │ payload.ptr      │
│  = 0x1000 ───┐   │              │  = 0x1000 ───┐   │ ? 危險(xiǎn)!
│              │   │              │              │   │
│ buffer (空)  │   │              │ buffer       │   │
│  data = null │   │              │  data = 0x2000   │
└──────────────┼───┘              └──────────────┼───┘
               │                                 │
               ▼                                 ▼
       這塊內(nèi)存不再被管理!              堆內(nèi)存 0x2000:
       但 payload 還指向它           "Thread 0 - Message #0"

問(wèn)題分析:

  • buffer 被正確移動(dòng),字符串內(nèi)容到了新位置 0x2000
  • payload.ptr 還是 0x1000(只拷貝了指針值)
  • 當(dāng) async_m 析構(gòu)后,0x1000 的內(nèi)存可能被釋放或覆蓋
  • 后臺(tái)線程讀取時(shí),payload.ptr 指向無(wú)效內(nèi)存 → 亂碼!

②  有自定義移動(dòng)賦值(正確的情況)

log_msg_buffer& operator=(log_msg_buffer&& other) noexcept {
    if (this != &other) {
        buffer = std::move(other.buffer);
        
        // ? 關(guān)鍵!手動(dòng)更新 payload 指向新的 buffer
        payload = string_view_t(buffer.data(), buffer.size());
    }
    return *this;
}

移動(dòng)后的狀態(tài):

棧上的 async_m:                    隊(duì)列中的 v_[tail_]:
┌──────────────────┐              ┌──────────────────┐
│ payload.ptr      │              │ payload.ptr      │
│  = 0x1000        │              │  = 0x2000 ───┐   │ ? 正確!
│                  │              │              │   │
│ buffer (空)      │              │ buffer       │   │
│  data = null     │              │  data = 0x2000   │
└──────────────────┘              └──────────────┼───┘
                                                 │
                                                 ▼
                                         堆內(nèi)存 0x2000:
                                    "Thread 0 - Message #0"

現(xiàn)在 payload.ptr 正確指向 buffer.data(),無(wú)論 async_m 何時(shí)析構(gòu)都不影響!

第四步:為什么同步模式?jīng)]問(wèn)題?

對(duì)比同步和異步的執(zhí)行流程:

(1) 同步模式

void logger::sink_it_(const log_msg& msg) {
    for (auto& sink : sinks_) {
        sink->log(msg);  // 直接調(diào)用,msg 還在棧上
    }
}
// msg 使用完才銷(xiāo)毀,payload 指向的內(nèi)存一直有效

關(guān)鍵: 整個(gè)過(guò)程中,fmt::memory_buffer buf 一直在棧上,msg.payload 指向的內(nèi)存始終有效。

(2) 異步模式

void async_logger::sink_it_(const log_msg& msg) {
    async_msg async_m(msg);  // 深拷貝到 async_m
    q_.enqueue(std::move(async_m));  // 移動(dòng)到隊(duì)列
}
// ? 返回后,async_m 被析構(gòu)
// 如果移動(dòng)不正確,隊(duì)列中的 payload 就懸空了!

關(guān)鍵: 消息要跨線程傳遞,必須保證數(shù)據(jù)的獨(dú)立性。如果移動(dòng)語(yǔ)義不正確,就會(huì)出現(xiàn)懸空指針。

第五步:完整的解決方案

(1) 修復(fù)代碼

在 async_msg.h 中添加正確的移動(dòng)語(yǔ)義:

struct log_msg_buffer : log_msg {
    std::string buffer;
    
    log_msg_buffer() = default;
    
    // 構(gòu)造時(shí)深拷貝
    explicit log_msg_buffer(const log_msg& msg)
        : log_msg(msg)
        , buffer(msg.payload.data(), msg.payload.size())
    {
        payload = string_view_t(buffer.data(), buffer.size());
    }
    
    // ? 移動(dòng)構(gòu)造函數(shù)
    log_msg_buffer(log_msg_buffer&& other) noexcept
        : log_msg(other)
        , buffer(std::move(other.buffer))
    {
        // 關(guān)鍵:更新 payload 指向新的 buffer
        payload = string_view_t(buffer.data(), buffer.size());
    }
    
    // ? 移動(dòng)賦值運(yùn)算符
    log_msg_buffer& operator=(log_msg_buffer&& other) noexcept {
        if (this != &other) {
            log_msg::operator=(other);
            buffer = std::move(other.buffer);
            
            // 關(guān)鍵:更新 payload 指向新的 buffer
            payload = string_view_t(buffer.data(), buffer.size());
        }
        return *this;
    }
};

struct async_msg : log_msg_buffer {
    async_msg_type msg_type{async_msg_type::log};
    async_logger_ptr worker_ptr;
    
    async_msg() = default;
    ~async_msg() = default;

    async_msg(const async_msg&) = delete;
    async_msg& operator=(const async_msg&) = delete;
    
    // ? 移動(dòng)構(gòu)造
    async_msg(async_msg&& other) noexcept
        : log_msg_buffer(std::move(other))
        , msg_type(other.msg_type)
        , worker_ptr(std::move(other.worker_ptr))
    {}
    
    // ? 移動(dòng)賦值
    async_msg& operator=(async_msg&& other) noexcept {
        if (this != &other) {
            log_msg_buffer::operator=(std::move(other));
            msg_type = other.msg_type;
            worker_ptr = std::move(other.worker_ptr);
        }
        return *this;
    }
    
    // 其他構(gòu)造函數(shù)...
};

(2) 驗(yàn)證修復(fù)

添加調(diào)試代碼驗(yàn)證:

log_msg_buffer& operator=(log_msg_buffer&& other) noexcept {
    if (this != &other) {
        std::cout << "=== 移動(dòng)賦值 ===" << std::endl;
        std::cout << "移動(dòng)前 payload: " << (void*)payload.data() << std::endl;
        std::cout << "other.buffer: " << (void*)other.buffer.data() << std::endl;
        
        buffer = std::move(other.buffer);
        
        std::cout << "移動(dòng)后 buffer: " << (void*)buffer.data() << std::endl;
        
        payload = string_view_t(buffer.data(), buffer.size());
        
        std::cout << "更新后 payload: " << (void*)payload.data() << std::endl;
        std::cout << "內(nèi)容: " << std::string(payload) << std::endl;
    }
    return *this;
}

修復(fù)后的輸出:

=== 移動(dòng)賦值 ===
移動(dòng)前 payload: 0x0
other.buffer: 0x7f5808000b60
移動(dòng)后 buffer: 0x7f5808000b60
更新后 payload: 0x7f5808000b60
內(nèi)容: Thread 0 - Message #0

完美!payload 正確指向了新的 buffer。

核心知識(shí)點(diǎn)總結(jié)

(1) string_view 的本質(zhì)

class string_view {
    const char* data_;   // 只是指針
    size_t size_;        // 和長(zhǎng)度
    // 不擁有內(nèi)存!
};

記住:string_view 是觀察者,不是擁有者。

(2) 移動(dòng)語(yǔ)義的陷阱

當(dāng)類(lèi)中同時(shí)包含擁有型(如 std::string)和觀察型(如 string_view)成員時(shí):

struct Bad {
    std::string data;
    string_view view;  // 指向 data
    
    // ? 默認(rèn)移動(dòng)不會(huì)更新 view!
};

必須手動(dòng)實(shí)現(xiàn)移動(dòng)語(yǔ)義,確保觀察者指向正確的擁有者。

(3) 生活化類(lèi)比

std::string   = 房子(你擁有)
string_view   = 房子地址(別人用來(lái)找你)

搬家(移動(dòng))后:
- 房子到了新位置
- 但地址沒(méi)更新
- 別人按舊地址找你 → 找錯(cuò)地方!

正確做法:
- 搬家后,更新所有名片上的地址

(4) 調(diào)試技巧

遇到類(lèi)似問(wèn)題,可以:

  • 打印指針地址:看 string_view 和 std::string 是否對(duì)應(yīng)
  • 檢查移動(dòng)時(shí)機(jī):在移動(dòng)構(gòu)造/賦值中加 log

經(jīng)驗(yàn)教訓(xùn)

  • 使用 string_view 要謹(jǐn)慎:確保它指向的內(nèi)存生命周期夠長(zhǎng)
  • 異步場(chǎng)景更需謹(jǐn)慎:數(shù)據(jù)跨線程傳遞,必須獨(dú)立管理內(nèi)存
  • 自定義移動(dòng)語(yǔ)義時(shí):要更新所有"觀察者"成員
  • 測(cè)試要全面:不能只測(cè)同步,也要測(cè)異步
責(zé)任編輯:趙寧寧 來(lái)源: 跟著小康學(xué)編程
相關(guān)推薦

2023-10-25 13:27:20

C++字符串

2023-12-18 10:11:36

C++17C++代碼

2014-11-26 10:23:09

2023-12-18 09:26:12

C++switchif

2015-11-12 09:27:13

C++最新進(jìn)展

2021-05-27 22:46:00

Nacos Clien版本Nacos

2024-04-10 12:22:19

DubboNacos微服務(wù)

2024-12-18 06:00:00

C++17C++

2010-02-22 13:53:22

Python 中文亂碼

2025-04-27 00:04:00

C#異步編程

2010-01-28 16:31:54

C++類(lèi)型

2023-02-20 08:11:04

2025-01-03 08:34:40

2024-12-17 00:00:00

Spring線程

2009-09-01 16:14:11

C#泛型

2010-02-05 15:33:29

Android JDK

2024-12-19 11:30:00

C++17CTAD代碼

2021-12-28 08:17:41

循環(huán) forgo

2017-07-17 15:46:20

Oracle并行機(jī)制

2024-04-10 08:39:56

BigDecimal浮點(diǎn)數(shù)二進(jìn)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美成熟毛茸茸复古| 九九久久综合网站| 邪恶网站在线观看| 国产黄色小视频在线| 成人在线一区二区三区| 国产成人精品在线观看| 欧美激情图片小说| 四虎884aa成人精品最新| 欧美日韩在线免费视频| 日本中文字幕在线视频观看| 国产在线资源| 成人一级片在线观看| 国产精品精品视频| 日本特黄一级片| 日韩国产在线| 亚洲精品短视频| 狠狠干狠狠操视频| 中国色在线日|韩| 亚洲欧美二区三区| 日韩精品无码一区二区三区| 精品国产九九九| 日韩精品免费专区| 97精品久久久| 69av.com| 久久精品青草| 国产一区二区美女视频| 中文文字幕文字幕高清| 精品一区二区三区中文字幕在线| 欧美性猛交xxxxx水多| 大胆欧美熟妇xx| 老司机福利在线视频| 国产丝袜美腿一区二区三区| 官网99热精品| 精品国产av一区二区| 久久99精品国产.久久久久久| 日本精品久久久久久久| 日本五十路女优| 亚洲夜间福利| 欧美激情videos| 亚洲一二三在线观看| 欧美色婷婷久久99精品红桃| 日韩激情在线视频| v天堂中文在线| 视频在线观看免费影院欧美meiju| 欧美视频中文字幕| 久久中文免费视频| 少女频道在线观看高清| 国产精品久久久久aaaa樱花| 欧美国产一二三区| 天天操天天操天天| 不卡的av在线播放| 99一区二区| 超碰人人人人人人| 国产成人亚洲综合a∨婷婷图片| 国产在线观看91精品一区| 免费在线观看av的网站| 日韩精品91亚洲二区在线观看| 97色在线视频| 成人免费a视频| 性色一区二区三区| 欧美性受xxx| 日韩精品一区二区亚洲av| 国产一区成人| 日本视频久久久| 日本免费精品视频| 日韩不卡一区二区| 国产日韩欧美电影在线观看| 在线视频免费观看一区| 精品一区二区av| 亚洲free性xxxx护士白浆| 性生交大片免费看女人按摩| 大尺度一区二区| 精品视频第一区| 毛片免费在线观看| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 久久天天躁狠狠躁夜夜av| 欧美h片在线观看| 午夜日韩电影| 5566成人精品视频免费| 中文字幕 亚洲视频| 久久 天天综合| 国产福利一区二区三区在线观看| 四虎永久在线观看| 国产午夜久久久久| 日韩不卡一二区| 超碰在线视屏| 欧美网站大全在线观看| 交换做爰国语对白| 色先锋久久影院av| 色琪琪综合男人的天堂aⅴ视频| 天天操天天操天天操天天操天天操| 欧美天天在线| 国产成人一区二区三区小说| 国产伦精品一区二区三区免.费| 懂色一区二区三区免费观看| 日本不卡高清视频一区| 在线视频观看国产| 色婷婷国产精品| 最新免费av网址| 任你躁在线精品免费| 少妇高潮久久77777| 久久亚洲成人av| 男女男精品视频| 国产精品99久久久久久久 | 亚洲一区二区三区四区电影| 亚洲欧美日韩成人| 欧美激情精品久久| 免费成人在线观看| 精品久久蜜桃| dy888亚洲精品一区二区三区| 精品日韩中文字幕| 免费不卡av网站| 精品国产日韩欧美| 91禁外国网站| 午夜精品小视频| 亚洲欧洲一区二区三区| 精品久久久久久久免费人妻| 中文字幕一区日韩精品| 日韩在线观看免费全| 人妻丰满熟妇av无码区| 从欧美一区二区三区| 欧美 日韩 国产 在线观看| 综合另类专区| 精品国产精品网麻豆系列| 久久精品亚洲a| 日日摸夜夜添夜夜添亚洲女人| 国产伦精品一区二区三区在线| 毛片网站在线免费观看| 91精品福利在线| 9.1成人看片| 在线欧美亚洲| 国产精品av一区| 少女频道在线观看免费播放电视剧| 精品视频一区二区不卡| 丰满少妇一区二区| 国产色综合网| 国产专区一区二区| 波多野结衣久久| 日韩午夜在线观看视频| 亚洲国产123| 久久成人免费日本黄色| 亚洲国产欧美日韩| 国产亚洲精品精品国产亚洲综合| 亚洲人成在线免费观看| 欧产日产国产69| 久久夜色精品一区| 日本一本二本在线观看| 亚洲毛片免费看| 日韩av成人在线观看| 九色在线视频| 在线观看亚洲精品视频| 最近中文字幕在线mv视频在线| 男女精品网站| 日韩国产精品一区二区| 国产日韩另类视频一区| 一本色道久久综合狠狠躁篇的优点| av一级在线观看| 国产欧美一区二区三区在线老狼 | 电影亚洲一区| 中国人与牲禽动交精品| 在线观看国产成人| 亚洲欧美在线观看| 欧美人与性动交α欧美精品| 欧美特黄a级高清免费大片a级| 91观看网站| 9999在线视频| 亚洲深夜福利在线| 亚洲无码精品在线播放| 亚洲少妇中出一区| 中文字幕永久免费| 免费在线观看成人av| 神马影院我不卡午夜| 香蕉久久一区| 欧美极品少妇xxxxⅹ裸体艺术| 神马久久久久久久久久| 91久久精品一区二区二区| 青青青视频在线播放| 国产精品一区在线观看你懂的| 2018日日夜夜| 精品国产一区二区三区久久久樱花| 国产精品爽爽爽| 日本在线视频www鲁啊鲁| 亚洲精品成人久久电影| 亚洲精品91天天久久人人| 自拍偷在线精品自拍偷无码专区 | 国产精品自在线拍| 国产成人自拍视频在线观看| 久草免费在线| 亚洲激情视频在线| 夜夜嗨aⅴ一区二区三区| 伊人色综合久久天天| 无码熟妇人妻av| 国产一区二区精品久久99| 久久精品国产精品亚洲色婷婷| 精品国产视频| 国产青春久久久国产毛片| 日韩中文视频| 久久久噜噜噜久久久| 国产51人人成人人人人爽色哟哟 | 欧美日韩免费区域视频在线观看| 日韩黄色中文字幕| a级精品国产片在线观看| 欧美一级xxxx| 久久久久久亚洲精品杨幂换脸| 狠狠精品干练久久久无码中文字幕 | 99热在线精品观看| 伊人久久大香线蕉精品| 91人人爽人人爽人人精88v| 久久青草伊人| 欧美男插女视频| 自拍视频在线| 亚洲奶大毛多的老太婆| 丰满人妻一区二区三区免费视频| 在线区一区二视频| 成人精品免费在线观看| 亚洲激情综合网| 2017亚洲天堂| 国产目拍亚洲精品99久久精品| av电影在线播放| 国产一区二区视频在线| 丁香婷婷激情网| 午夜亚洲性色福利视频| 97超碰在线人人| 欧美成熟视频| 中文字幕在线乱| 久久国产影院| 少妇免费毛片久久久久久久久| 亚洲人挤奶视频| 精品日产一区2区三区黄免费| 2021年精品国产福利在线| 成人黄色短视频在线观看| 视频精品导航| 国产精品久久久av| 超碰国产一区| 欧洲亚洲免费视频| 制服丝袜专区在线| 欧美在线视频一区| 黄在线观看免费网站ktv| 性色av一区二区三区免费| 日本在线视频www鲁啊鲁| 欧美黑人巨大xxx极品| 亚洲资源一区| 欧美高清在线视频观看不卡| 中文在线免费| 色综合男人天堂| 欧美xxxx免费虐| 欧美激情一二三| 不卡的av影片| 91精品国产91久久久久久吃药| bl在线肉h视频大尺度| 久久免费在线观看| 色偷偷偷在线视频播放| 青青草99啪国产免费| 超级碰碰久久| 国产欧美久久久久久| 999精品视频在线观看| 91欧美视频网站| 一区二区亚洲视频| 狠狠干一区二区| 妖精一区二区三区精品视频 | 亚洲国产成人精品女人| 大桥未久一区二区| 尹人成人综合网| 六月丁香婷婷激情| 青草av.久久免费一区| 男生操女生视频在线观看| 国产东北露脸精品视频| 中文字幕无码人妻少妇免费| www激情久久| 人与动物性xxxx| 一区二区三区在线观看国产| 国产无遮挡aaa片爽爽| 色综合一个色综合| 国产影视一区二区| 精品少妇一区二区三区在线播放 | 视频一区日韩| 蜜桃免费一区二区三区| 久久中文字幕av| 隔壁人妻偷人bd中字| 性欧美videos另类喷潮| 91精品999| 播五月开心婷婷综合| 日本少妇xxxxx| 一区二区三区加勒比av| 国产小视频在线免费观看| 欧美日韩国产一区二区三区地区| www.精品视频| 亚洲欧美视频在线| 在线午夜影院| 国产精品88a∨| 亚洲精品不卡在线观看| 欧美日韩国产一二| 欧美一区二区| www.xxx亚洲| 国产91精品一区二区麻豆亚洲| 真实乱视频国产免费观看| 亚洲欧美日韩国产另类专区| 久久亚洲精品国产| 日韩欧美在线网站| 国产视频福利在线| 久久理论片午夜琪琪电影网| 国产成人a视频高清在线观看| 波多野结衣久草一区| 精品盗摄女厕tp美女嘘嘘| 欧美人成在线观看| 精品系列免费在线观看| ass精品国模裸体欣赏pics| 亚洲私人影院在线观看| 国产污视频网站| 精品国产一区a| 日本电影在线观看网站| 热草久综合在线| 福利电影一区| 国产又粗又大又爽的视频| 日韩国产在线一| 国产麻豆天美果冻无码视频| 亚洲乱码日产精品bd| 中文字幕视频在线播放| 精品视频久久久久久久| caoprom在线| 99久久自偷自偷国产精品不卡| 日韩电影免费在线观看| 手机看片福利盒子久久| 91丨porny丨蝌蚪视频| 国产亚洲精品久久久久久无几年桃| 欧美日韩和欧美的一区二区| 高清av在线| 国产97在线播放| 日韩影视在线观看| 欧美成人三级在线视频| 国产91丝袜在线播放0| 特级片在线观看| 日韩女同互慰一区二区| 中文字幕中文字幕在线十八区| 成人免费网视频| 亚洲精品国产成人影院| 97超碰人人爽| 亚洲欧洲性图库| 国产美女免费看| 久久成人人人人精品欧| 国产精品一站二站| 99精品视频网站| 国产精品亚洲成人| 免费视频网站www| 精品久久久久99| 国产精品论坛| 欧美在线视频二区| 日韩精品亚洲一区| 一级免费黄色录像| 欧美一区二区福利在线| 影音先锋男人资源在线| 成人午夜电影免费在线观看| 精品成人免费| 黄色国产在线观看| 日本道免费精品一区二区三区| 可以直接在线观看的av| 国产精品视频99| **女人18毛片一区二区| 国产高潮失禁喷水爽到抽搐| 午夜精品一区二区三区三上悠亚| 天堂网av在线播放| 国产91免费看片| 久久福利综合| 伊人av在线播放| 大伊人狠狠躁夜夜躁av一区| 激情小说 在线视频| 国产女人精品视频| 亚洲人体av| 中文字幕在线视频播放| 一本大道av伊人久久综合| av在线电影院| 亚洲一区美女视频在线观看免费| 激情久久一区| 日韩精品无码一区二区三区久久久| 欧美视频一区二区三区在线观看 | 国产精品999| 91精品国产乱码久久久久久| 扒开伸进免费视频| 欧美日韩在线播放一区| 欧美videosex性极品hd| 欧美日韩亚洲在线| 国产一二精品视频| 四虎精品永久在线| 久久久91精品国产| 欧美大胆视频| 中文字幕1234区| 精品国产1区2区| 午夜老司机在线观看| 国产精品一区二区三区四区五区 | 欧美体内she精高潮| 一本一道波多野结衣一区二区| 欧美日本高清| 久久精品人成| 国产一区二区三区精品视频| 国产精品男女视频| 久久99精品视频一区97| 欧美偷拍综合| 中文视频在线观看| 91精品国产综合久久久蜜臀图片| 岛国av在线网站|