日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++学习之路: 智能指针

發布時間:2024/4/11 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++学习之路: 智能指针 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C/C++學習之路: 智能指針


目錄

  • 前言
  • shared_ptr

  • 1. 前言

  • 在C++中,動態內存的管理是通過一對運算符完成的:
  • new:在動態內存中為對象分配空間并返回一個指向該對象的指針,可以選擇對對象進行初始化
  • delete:接受一個動態對象的指針,銷毀該對象,并釋放與之關聯的內存
  • 動態內存使用容易出現問題,因為很難保證在正確的時間釋放內存,如果忘記釋放內存就會產生內存泄漏,或者在有指針引用內存的情況下釋放就會產生引用非法內存的指針。
  • 為了更方便也更安全使用動態內存,新的標準庫提供了兩種智能指針類型來管理動態對象。智能指針類似于常規指針,區別在于智能指針負責自動釋放所指向的對象。
  • 新標準庫提供的這兩種智能指針區別在于管理低層指針的方式:
  • shared_ptr允許多個指針指向同一個對象。
  • unique_ptr則獨占所指向的對象。
  • 標準庫還定義了weak_ptr的伴隨類,是一種弱引用,指向shared_ptr所管理的對象。

  • 2. shared_ptr

  • 類似于vector,智能指針也是模板,創建一個智能指針時,必須提供指針可以指向的類型。
  • shared_ptr<int> p1; shared_ptr<list<string>> p2;
  • 默認智能指針保存一個空指針。
  • 智能指針的使用方式和普通指針類似,解引用一個智能指針返回它指向的對象。如果在一個條件判斷中使用智能指針就是檢測它是否為空。
  • if (p1 && p1->empty()) {*p1 = "hi"; }
  • 下標列出了shared_ptr和unique_ptr都支持的操作。

  • shared_ptr獨有的操作

  • 1. make_shared函數

  • 最安全的分配和使用動態內存的方法是調用一個名為make_shared的標準庫函數,會在動態內存中分配一個對象并初始化它,返回指向此對象的shared_ptr。
  • 當用make_shared時,必須指定要創建的對象的類型。
  • //指向一個值為42的int的shared_ptr shared_ptr<int> p3 = make_shared<int>(42); //指向一個值為"999999999"的string shared_ptr<string> p4 = make_shared<string>(10, '9'); //指向一個值初始化的int,即值為0 shared_ptr<int> p5 = make_shared<int>();
  • make_shared用參數來構造給定類型的對象,如果不傳遞任何參數,對象就進行值初始化。
  • //p6指向一個動態分配的空vector<string> auto p6 = make_shared<vector<string>>();

    2. shared_ptr的拷貝和賦值

  • 當進行拷貝或賦值時,每個shared_ptr都會記錄有多少個其他shared_ptr指向相同的對象:
  • auto p = make_shared<int>(42); //p指向的對象只有p一個引用者auto q(p); //p和q指向相同對象,此對象有兩個引用者
  • 每個shared_ptr都有一個引用計數器,無論拷貝哪個shared_ptr,計數器都會遞增。比如用一個shared_ptr初始化另一個shared_ptr,或者將它作為參數傳遞給一個函數以及作為函數的返回值時,所關聯的計數器都會遞增。
  • 當給shared_ptr賦予一個新值或是shared_ptr被銷毀(例如一個局部的shared_ptr離開其作用域),計數器就會遞減。
  • 一旦一個shared_ptr計數器為0,就會自動釋放自己所管理的對象。
  • auto r = make_shared<int>(42);r = q; //給r賦值,令它指向另一個地址// 遞增q指向的對象的引用計數,遞減r原來指向的對象的引用計數// r原來指向的對象已沒有引用者,會自動釋放
  • 上例中分配了一個int,將其職責保存在r中,接下來將一個新的值賦予r,在此情況下,r是唯一指向此int的shared_ptr,在把q賦給r后,此int被自動釋放。
  • 3. shared_ptr自動銷毀所管理的對象

  • 當指向一個對象的最后一個shared_ptr被銷毀時,shared_ptr類會自動銷毀此對象。它是通過析構函數完成銷毀工作的。
  • 析構函數一般用來釋放對象所分配的資源。例如string的構造函數會分配內存來保存構成string的字符。string的析構函數就負責釋放這些內存。
  • shared_ptr的析構函數會遞減它所指向的對象的引用計數,如果引用計數為0,shared_ptr的析構函數就會銷毀對象,并釋放它占用的內存。
  • 4. shared_ptr還會自動釋放相關聯的內存

  • 當動態對象不再使用時,shared_ptr類會自動釋放動態對象,這一特性使得動態內存的使用變得非常容易。
  • 例如有一個函數,返回一個shared_ptr,指向一個Foo類型的動態分配的對象,對象是通過一個類型為T的參數進行初始化的:
  • shared_ptr<Foo> factory(T arg) {//恰當處理arg//shared_ptr負責釋放內存return make_shared<Foo>(arg); }
  • 由于factory返回一個shared_ptr,所以可以確保它分配的對象會在恰當的時刻被釋放。例如,下面的函數將factory返回的shared_ptr保存在局部變量中:
  • void use_factory(T arg) {shared_ptr<Foo> p = factory(arg);//使用p,p離開作用域,它指向的內存會被自動釋放掉 }
  • 由于p是use_factory的局部變量,在use_factory結束時它將被銷毀,當p被銷毀時,將遞減其引用計數并檢查它是否為0,例子中,p是唯一引用factory返回的內存的對象。由于p將要銷毀,p指向的這個對象也會被銷毀,所占用的內存會釋放。
  • 但如果有其他shared_ptr也指向這塊內存,它就不會被釋放。
  • 對于一塊內存,shared_ptr類保證只要有任何shared_ptr對象引用它,它就不會被釋放掉。
  • 由于最后一個shared_ptr銷毀前內存都不會被釋放,保證shared_ptr在無用之后不再保留就很重要了。
  • 如果忘記銷毀程序不再需要的shared_ptr,程序仍會正常執行,但會浪費內存。
  • 如果將shared_ptr存放于一個容器中,而后不再需要全部元素,而只使用其中一部分,要記得用erase刪除不再需要的那些元素。
  • 5. 使用了動態生存期的資源的類

  • 程序使用動態內存出于以下三種原因之一
  • 程序不知道自己需要使用多少對象
  • 程序不知道所需對象的準確類型
  • 程序需要在多個對象間共享數據
  • 容器類是出于第一種原因而使用動態內存的典型例子。下面將定義一個類,使用動態內存是為了讓多個對象能共享相同的底層數據。
  • 在我們使用過的類中,分配的資源都與對應對象生存期一致。例如每個vector“擁有”自己的元素,當我們拷貝一個vector時,原vector和副本vector中的元素的相互分離的。
  • vector<string> v1; //空vector{vector<string> v2 = {"a", "an", "the"};v1 = v2; // 從v2拷貝元素到v1中} //v2被銷毀,其中的元素也被銷毀,v1有三個元素,是原來v2中元素的拷貝
  • 由一個vector分配的元素只有當這個vector存在時才存在,當一個vector被銷毀時,這個vector中的元素也都被銷毀。
  • 但某些類分配的資源具有與原來對象相獨立的生存期。例如,定義一個Blob的類,保存一組元素,Blob對象的不同拷貝之間共享相同的元素,即當拷貝一個Blob時,原Blob對象及其拷貝應該引用相同的低層元素。
  • 一般而言,如果兩個對象共享底層的數據,當某個對象被銷毀時,不能單方面地銷毀底層數據:
  • Blob<string> b1; //空Blob{ //新作用域Blob<string> b2 = {"a", "an", "the"};b1 = b2; // b1和b2共享相同的元素} // b2被銷毀了,但b2中的元素不能銷毀,b1指向最初由b2創建的元素
  • b1和b2共享相同的元素,當b2離開作用域后,這些元素必須保留,因為b1仍然在使用它們。
  • 使用動態內存的一個常見原因是允許多個對象共享相同的狀態。
  • 6. 定義StrBlob類

  • 定義一個管理string的類命名為StrBlob,實現一個新的集合類型最簡單方法是使用某個標準庫容器來管理元素,在本例中,將使用vector保存元素。
  • 為了保證vector的元素繼續存在,將vector保存在動態內存中。為每個StrBlob設置一個shared_ptr來管理動態分配的vector。此shared_ptr的成員將記錄有多少個StrBlob共享相同的vector,并在vector的最后一個使用者被銷毀時釋放vector。
  • 這個類提供的操作有修改訪問元素的操作(如front和back),如果用戶訪問不存在的元素,會拋出一個異常。
  • 類有一個默認構造函數和一個析構函數,接受單一的initializer_list類型參數。此構造函數可以接受一個初始化器的花括號列表。
  • class StrBlob { public:typedef std::vector<std::string>::size_type size_type;StrBlob();StrBlob(std::initializer_list<std::string> il);size_type size() const { return data->size(); }bool empty() const { return data->empty(); }//添加和刪除元素void push_back(const std::string &t) { data->push_back(t); }void pop_back();//元素訪問std::string &front();std::string &back();private:std::shared_ptr<std::vector<std::string>> data;//如果data[i]不合法,拋出一個異常void check(size_type i, const std::string &msg) const;};
  • StrBlob類實現了size,empty和push_back成員。這些成員通過指向底層vector的data成員來完成工作。例如,對一個StrBlob對象調用size()會調用data->size(),以此類推。
  • 7. StrBlob構造函數

  • 兩個構造函數都使用初始化列表來初始化其data成員,令它指向一個動態分配的vector。默認構造函數分配了一個空vector。
  • StrBlob::StrBlob() : data(make_shared<vector<string>>()) {}StrBlob::StrBlob(std::initializer_list<std::string> il) : data(make_shared<vector<string>>(il)) {}
  • 接受一個initializer_list的構造函數將其參數傳遞給對應的vector構造函數。此構造函數通過拷貝列表中的值來初始化vector的元素。
  • 8. 元素訪問成員函數

  • pop_back、front和back操作訪問vector中的元素,這些操作試圖訪問元素之前必須檢查元素是否存在。
  • 由于這些成員函數需要做相同的檢查操作,所以為StrBlob定義了一個名為check的private工具函數,它檢查一個給定索引是否在合法范圍內。
  • 除了索引,check還接受一個string參數傳遞給異常處理程序,這個string描述了錯誤內容。
  • void StrBlob::check(StrBlob::size_type i, const std::string &msg) const {if (i >= data->size()) {throw out_of_range(msg);} }
  • pop_back和元素訪問成員函數首先調用check。如果check成功,這些成員函數繼續利用底層vector的操作來完成自己的工作。
  • std::string &StrBlob::front() {//如果vector為空,check會拋出一個異常check(0, "front ont empty StrBlob");return data->front(); }std::string &StrBlob::back() {check(0, "back ont empty StrBlob");return data->back(); }void StrBlob::pop_back() {check(0, "pop_back ont empty StrBlob");data->pop_back(); }

    9. StrBlob的拷貝,賦值和銷毀

  • StrBlob使用默認版本的拷貝、賦值和銷毀成員函數來對此類型的對象進行操作。StrBlob類只有一個數據成員,它是shared_ptr類型,因此,當拷貝,賦值和銷毀一個StrBlob對象時,它的shared_ptr成員會被拷貝,賦值和銷毀。
  • 拷貝一個shared_ptr會遞增其引用計數,將一個shared_ptr賦予另一個shared_ptr會遞增賦值號右側shared_ptr的引用計數,而遞減左側shared_ptr的引用計數。
  • 如果一個shared_ptr的引用計數變為0,它所指向的對象會被自動銷毀,因此,對于StrBlob構造函數分配的vector,當最后一個指向它的StrBlob對象被銷毀時也會隨著銷毀。

  • 2. 直接管理內存

  • C++定義了兩個運算符來分配和釋放動態內存。運算符new分配內存,delete釋放new分配的內存。
  • 相對于智能指針,使用這兩個運算符管理內存非常容易出錯,直接管理內存的類與使用智能指針的類不同,不能依賴對象拷貝、賦值和銷毀操作的任何默認定義。
  • 因此,使用智能指針的程序更容易編寫和調試。
  • 1. 使用new動態分配和初始化對象

  • 在自由空間分配的內存是無名的,因此new無法為其分配的對象命名,而是返回一個指向對象的指針:
  • int *p = new int; //p指向一個動態分配的、未初始化的無名對象
  • 默認情況下,動態分配的對象是默認初始化的,意味著內置類型或組合類型的對象是指將是未定義的,而類的類型對象將用默認夠贊函數進行初始化。
  • string *ps = new string; //初始化為空string
  • 可以使用直接初始化方式來初始化一個動態分配的對象。
  • int *pi = new int(1024); //pi指向的對象的值為1024 string *ps = new string(10,'9'); // *ps為‘9999999999’ //vector有10個元素,值依次從0到9 vector<int> *pv = new vector<int>{0,1,2,3,4,5,6,7,8,9};
  • 也可以對動態分配的對象進行值初始化,只需要在類型名后跟一對空括號就行
  • string *ps1 = new string; //默認初始化為空string string *ps = new string(); //值初始化為空string int *pi1 = new int; //默認初始化,*pi1的值未定義 int *pi2 = new int(); //值初始化為0,*pi2為0
  • 對于定義了自己的構造函數的類類型(例如string)來說,要求值初始化是沒有意義的。不管采用什么形式,對象都會通過默認構造函數來初始化。
  • 但對于內置類型,兩種形式的差別就很大:值初始化的內置類型對象有定義的值,而默認初始化的對象的值是未定義的。
  • 對于類中那些依賴編譯器合成的默認構造函數的內置類型成員,如果它們未在類中被初始化,那么值也是未定義的。
  • 如果提供了一個括號包圍的初始化器,就可以使用auto從此初始化器來推斷想要分配的對象的類型。
  • 但是,由于編譯器要用初始化器的類型來推斷要分配的類型,只有當括號中僅有單一初始化器材可以使用auto:
  • auto p1 = new auto(obj); //p指向一個與obj類型相同的對象,該對象用obj進行初始化 auto p2 = new auto{a,b,c}; // 錯誤:括號中只能有單個初始化器
  • p1的類型是一個指針,指向從obj自動推斷出的類型。如果obj是一個int,那么p1就是int *,如果obj是string,那么p1就是string *。
  • 2. 動態分配的const對象

  • 用new分配const對象是合法的
  • const int *pci = new const int(1024); //分配并初始化一個const int const string *pcs = new const string; //分配并默認初始化一個const的空string
  • 一個動態分配的const對必須進行初始化,對于一個定義了默認構造函數的類類型,const動態對象可以隱式初始化,而其他類型的對象就必須顯式初始化。
  • 由于分配的對象是const的,new返回的指針是一個指向const的指針。
  • 3. 內存耗盡

  • 一旦一個程序用光了它所有可用的內存,new表達式就會失敗。默認情況下,如果new不能分配所要求的內存空間,就會拋出一個類型為bad_alloc的異常,我們可以改變使用new的方式來阻止它拋出異常。
  • //如果分配失敗,new返回一個空指針 int *p1 = new int; // 如果分配失敗,new拋出std::bad_alloc int *p2 = new (nothrow) int; //如果分配失敗,new返回一個空指針

    4. 釋放動態內存

  • 為了防止內存耗盡,在動態內存使用完畢后,必須將其歸還給系統。通過delete表達式來將動態內存歸還給系統。delete表達式接受一個指針,指向我們想要釋放的對象:
  • delete p; //p必須指向一個動態分配的對象或者是一個空指針。
  • delete表達式執行兩個動作:銷毀給定的指針指向的對象,釋放對應的內存
  • 5. 指針值和delete

  • 傳遞給delete的指針必須指向動態內存分配的內存,或者是一個空指針。釋放一塊非new分配的內存,或者將相同的指針值釋放多次,其行為是未定義的。
  • int i, *pi1 = &i, *pi2 = nullptr; double *pd = new double(33), *pd2 = pd; delete i; // 錯誤:i不是一個指針 delete pi1; // 未定義,pi1指向一個局部變量 delete pd; // 正確 delete pd2; // 未定義:pd2指向的內存已經被釋放了 delete pi2; // 正確,釋放一個空指針總是沒有錯誤的
  • 對于delete i的請求,編譯器會生成一個錯誤信息,因為它知道i不是一個指針。
  • 執行delete pi1和pd2所產生的錯誤則更具潛在危害:因為通常情況下,編譯器不能分辨一個指針指向的是靜態還是動態分配的對象。
  • 類似的,編譯器也不能分辨一個指針所指向的內存是否已經被釋放掉了。
  • 對于這些delete表達式,大多數編譯器會編譯通過,盡管是錯誤的。
  • const對象的值不能被改變,但本身是可以被銷毀的。
  • const int *pci = new const int(1024); delete pci; // 正確,釋放一個const對象

    6. 動態對象的生存期直到被釋放為止

  • shared_ptr管理的內存在最后一個shared_ptr銷毀時會自動釋放。但對于通過內置指針類型來管理的動態對象,直到被顯式釋放之前都是存在的。
  • 返回指向動態內存的指針的函數,調用者必須記得釋放內存。
  • // factory返回一個指針,指向一個動態分配的對象 Foo* factory(T arg){return new Foo(arg); //調用者負責釋放此內存 }
  • factory分配一個對象,但不delete,factory的調用者負責在不需要此對象時釋放。
  • void use_factory(T arg) {Foo *p = factory(arg); //使用*p但不delete } // p離開了它的作用域,但它指向的內存沒有被釋放
  • 修正這個錯誤的正確方法是在use_factory中釋放內存
  • void use_factory(T arg) {Foo *p = factory(arg); // 使用pdelete p; }
  • 如果系統中的其他代碼要使用use_factory所分配的對象,就要返回一個指針,指向它分配的內存
  • Foo* use_factory(T arg) {Foo *p = factory(arg); // 使用preturn p; //調用者必須釋放內存 }
  • 使用new和delete管理動態內存三個常見問題
  • 忘記delete內存。忘記釋放動態內存會導致“內存泄漏”問題,因為這種內存永遠不可能被歸還給自由空間了。查找內存泄漏問題是很難的,因為通常應用程序要運行很長時間后,真正耗盡內存時,才能檢測這種錯誤。
  • 使用已經釋放掉的對象。通過在釋放內存后將指針置為空,有時候可以檢測出這種錯誤。
  • 同一塊內存釋放兩次。當有兩個指針指向相同的動態分配對象時,可能發生這種錯誤。如果對其中一個指針進行delete操作,對象的內存就歸還給自由空間了,如果隨后又delete第二個指針,自由空間就可能被破壞。

  • 3. shared_ptr和new結合使用

  • 如果不初始化一個只能指針,就會被初始化為一個空指針。可以用new返回的指針來初始化智能指針。
  • shared_ptr p1; // shared_ptr可以指向一個double
    shared_ptr p2(new int(1024)); // p2指向一個值為42的int

  • 接受指針參數的智能指針構造函數是explicit的,因此,不能將一個內置指針隱式轉換為一個智能指針,必須使用直接初始化形式。
  • shared_ptr> p1 = new int(1024); // 錯誤:必須使用直接初始化形式
    shared_ptr p2(new int(1024)); // 正確:使用了直接初始化形式

  • 因為不能進行內置指針到智能指針的隱式轉換,因此第一條語句初始化是錯誤的,同樣,一個返回shared_ptr的函數不能在返回語句中隱式轉換一個普通指針。
  • shared_ptr clone(int p){
    return new int§; //錯誤:隱式轉換為 shared_ptr
    }

  • 一個用來初始化智能指針的普通指針必須指向動態內存,因為智能指針默認使用delete釋放所關聯的對象。

  • 可以將智能指針綁定到一個指向其他類型資源的指針上,但是為了這樣做,必須提供操作來代替delete。

  • 定義和改變shared_ptr的其他方法

  • shared_ptr p(q):p管理內置指針q所指向的對象,q必須指向new分配的內存,并且能夠轉換成T*類型
  • shared_ptr p(u):p從unique_ptr u那里接管了對象的所有權,將u置為空
  • shared_ptr p(q, d):p接管了內置指針q所指向對象的所有權,q必須能轉換為T*類型。p將使用可調用對象d來代替delete
  • shared_ptr p(p2, d):p是shared_ptr p2的拷貝,唯一區別是p將用可調用對象d來代替delete
  • p.reset():若p是唯一指向其對象的shared_ptr,reset會釋放此對象。
  • p.reset(q):若傳遞了可選的參數內置指針q,會令p指向q,否則將p值為空。
  • p.reset(q, d):如果還傳遞了參數d,將會調用d而不是delete來釋放q
  • 1. 不要混合使用普通指針和智能指針

  • shared_ptr可以協調對象的析構,但僅限于自身的拷貝之間。這也就是為什么推薦使用make_shared而不是new的原因。這樣就能在分配對象的同時將shared_ptr與之綁定,從而避免了無意中將同一塊內存綁定到多個獨立創建的shared_ptr上。
  • //在函數被調用是ptr被創建并初始化
    void process(shared_ptr ptr){
    //使用ptr
    } // ptr離開作用域被銷毀

  • process的參數是值傳遞方法,因此實參會被拷貝到ptr中,拷貝一個shared_ptr會遞增引用計數,因此,在process運行過程中,引用計數值至少為2。
  • 當process結束時,ptr的引用計數會遞減,但不會變為0。因此當局部變量ptr被銷毀時,ptr指向的內存不會被釋放。
  • shared_ptr p(new int(42)); //引用計數為1
    process§; //拷貝p會遞增它的引用計數,在process中引用計數值為2
    int i = *p; //正確:引用計數為1

  • 雖然不能傳遞給process一個內置指針,但可以傳遞一個臨時的shared_ptr,這個shared_ptr是用一個內置指針顯式構造的,但這樣很可能導致錯誤:
  • int x(new int(42));
    process(x); //錯誤:不能將int 轉換為一個shared_ptr
    process(shared_ptr(x)); //合法,但內存會被釋放
    int j = *x; //未定義的,x是一個空懸指針

  • 上面將一個臨時shared_ptr傳遞給process,當process結束時,臨時shared_ptr對象就被銷毀了,遞減引用計數,此時引用計數為0,所指向的內存會被釋放。x繼續指向已經釋放的內存,從而變成一個空懸指針。如果試圖使用x的值,是未定義的。
  • 當將一個shared_ptr綁定到一個普通指針時,就將內存管理交給了shared_ptr,就不應該再使用內置指針來訪問shared_ptr所指向的內存了。
  • 2. 也不要使用get初始化另一個指針指針或為智能指針賦值

  • 智能指針的get函數返回一個內置指針,指向智能指針管理的對象。此函數是為這樣一種情況設計的:需要向不能使用智能指針的代碼傳遞一個內置指針,但使用get返回的指針的代碼不能delete此指針。
  • 雖然編譯器不會給出錯誤信息,但將另一個智能指針也綁定到get返回的指針上是錯誤的:
  • shared_ptr p(new int(42)); //引用計數為1
    int *q = p.get(); // 正確,但使用q要注意,不能讓它管理的指針被釋放
    {
    //未定義,兩個獨立的shared_ptr指向相同的內存
    shared_ptr(q);
    } // 程序塊結束,q被銷毀,指向的內存被釋放
    int foo = *p; //未定義,p指向的內存已經被釋放了

  • p和q指向相同的內存,由于它們是相互獨立創建的,因此各自的引用計數為1.當q所在程序塊結束時,q被銷毀,導致q指向的內存被釋放,從而p變成一個空懸指針,此時使用p時將發生未定義的行為。
  • 而且,當p被銷毀時,這塊內存會被第二次delete
  • 3. 其他shared_ptr操作

  • shared_ptr定義了其他操作,可以用reset來講一個新的指針賦予一個shared_ptr
  • p = new int(42); //錯誤,不能想一個指針賦予shared_ptr
    p.reset(new int(42)); //正確,p指向一個新對象

  • 與賦值類似,reset會更新引用計數,如果需要的話,會釋放p指向的對象。reset成員經常與unique一起使用,來控制多個shared_ptr共享的對象。
  • 在改變底層對象之前,需要檢查自己釋放是當前對象僅有的用戶,如果不是,在改變之前要制作一份新的拷貝:
  • if(!p.unique())
    p.reset(new string(*p));
    *p += newVal;


    4. 智能指針和異常

  • 程序需要確保異常發生后資源能被正確釋放,如果使用智能指針,即使程序過早結束也能確保在不需要時將其釋放。
  • void f(){
    shared_ptr sp(new int(42)); //分配一個新對象
    // 這段代碼拋出一個異常,且在f中未被捕獲
    } // 在函數結束時shared_ptr自動釋放內存

  • 當發生異常時,直接管理的內存是不會自動釋放的,如果使用內置指針管理內存,且在new之后在對應的delete之前發生了異常,則內存不會被釋放:
  • void f(){
    int *ip = new int(42);
    // 這段代碼拋出一個異常,且在f中未被捕獲
    delete ip; // 在退出之前釋放內存
    }

    1. 智能指針和啞類

  • 分配了資源,而又沒有定義析構函數來釋放這些資源的類,可能會遇到與使用動態內存相同的錯誤:忘記釋放資源。如果在資源分配和釋放之間發生了異常,程序也會發送資源泄漏。
  • struct destination; // 表示我們正在連接什么
    struct connection; // 使用連接所需的信息
    connection connect(destination*); // 打開連接
    void f(destination &d){
    //獲得一個連接,記住使用完要關閉
    connection c = connect(&d);
    //使用連接
    //如果在f退出前忘記調用disconect,就無法關閉c
    }

  • 如果connection有一個析構函數,就可以在f結束時由析構函數自動關閉連接。但connection沒有析構函數,可以使用shared_ptr來保證connection被正確關閉。
  • 2. 使用我們自己的釋放操作

  • 默認情況下,shared_ptr假定它們指向的是動態內存,因此,當一個shared_ptr被銷毀時,它默認對它管理的指針進行delete操作。
  • 為了用shared_ptr來管理一個connection,必須定義一個函數來代替delete。這個刪除函數必須能夠完成對shared_ptr中保存的指針進行釋放的操作。
  • 我們的刪除器必須接受單個類型為connection *的參數:
  • void end_connection(connection *p) {disconect(*p);}

  • 當創建一個shared_ptr時,可以傳遞一個指向刪除器函數的參數:
  • void f(destination &d){
    connection c = connect(&d);
    shared_ptr p(&c, end_connection);
    //使用連接
    //當f退出時(及時是由于異常而退出),connection會被正確關閉
    }

  • 當p被銷毀時,不會對自己保存的指針執行delete,而是調用end_connection。
  • 如果f正常退出,那么p的銷毀會作為結束處理的一部分,如果發生了異常,p同樣會被銷毀,從而連接被關閉。
  • 1. 智能指針陷阱

  • 正確使用智能指針必須堅持的基本規范
  • 不使用相同的內置指針值初始化(或reset)多個智能指針
  • 不delete get()返回的指針
  • 不適用get()初始化或reset另一個智能指針
  • 如果使用get()返回的指針,最后一個對應的智能指針銷毀后,指針就變為無效了。
  • 如果智能指針管理的資源不是new分配的內存,需要傳遞一個刪除器

  • 5. unique_ptr

  • 一個unique_ptr擁有它所指向的對象,與shared_ptr不同,某個時刻只能有一個unique_ptr指向一個給定對象。
  • 當unique_ptr被銷毀時,所指的對象也被銷毀。
  • 當定義一個unique_ptr時,需要將unique_ptr綁定到一個new返回的指針上。初始化unique_ptr必須采用直接初始化形式。
  • unique_ptr<double> p1; // 可以指向一個double的unique_ptr unique_ptr<int> p2(new int(42)); // p2指向一個值為42的int
  • 由于unique_ptr擁有它指向的對象,因此unique_ptr不支持普通的拷貝或賦值操作
  • unique_ptr<string> p1(new string("hello)); unique_ptr<string> p2(p1); //錯誤:unique_ptr不支持拷貝 unique_ptr<string> p3; p3 = p2; //錯誤:unique_ptr不支持賦值
  • unique_ptr操作

  • unique_ptr u1:空unique_ptr,可以指向類型為T的讀寫,u1會使用delete來釋放它的指針。
  • unique_ptr<T, D> u2:u2會使用一個類型為D的可調用對象來釋放它的指針
  • unique_ptr<T, D> u(d):空unique_ptr,指向類型為T的對象,用類型為D的對象d代替delete
  • u = nullptr:釋放u指向的對象,將u置為空
  • u.release():u放棄對指針的控制權,返回指針,并將u置為空
  • u.reset():釋放u指向的對象
  • u.reset(q):如果提供了內置指針q,令u指向這個對象,否則將u置為空(u.reset(nullptr)
  • 雖然不能拷貝或賦值unique_ptr,但可以通過調用release或reset將指針所有權從一個(非const)unique_ptr轉移給另一個unique_ptr:

  • // 將所有權從p1(指向hello)轉移給p2unique_ptr<string> p1(new string("hello"));unique_ptr<string> p2(p1.release()); // release將p1置為空unique_ptr<string> p3(new string("trex"));p2.reset(p3.release()); //將所有權從p3轉移給p2,reset釋放了p2原來指向的內存
  • release成員返回unique_ptr當前保存的指針并將其置為空。因此,p2被初始化為p1原來保存的指針,而p1被置為空。
  • reset成員接受一個可選的指針參數,令unique_ptr重新指向給定的指針。如果unique_ptr不為空,它原來指向的對象被釋放。因此,對p2調用reset釋放了用“hello”初始化的string所使用的內存,將p3對指針的所有權轉移給p2,并將p3置為空。
  • 調用release會切斷unique_ptr和它原來管理的對象間的聯系,release返回的指針通常被用來初始化另一個智能指針或給另一個智能指針賦值。
  • 如果我們不用另一個智能指針來保存release返回的指針,程序就要負責資源的釋放。
  • p2.release(); //錯誤,p2不會釋放內存,而且我們丟失了指針。 auto p = p2.release(); //正確,但我們必須記得delete(p)

    1. 傳遞unique_ptr參數和返回unique_ptr

  • 不能拷貝unique_ptr的規則有一個例外:可以拷貝或賦值一個將要被銷毀的unique_ptr。
  • unique_ptr<int> clone(int p){//正確:從int* 創建一個unique_ptr<int>return unique_ptr<int>(new int(p)); }
  • 還可以返回一個局部對象的拷貝
  • unique_ptr<int> clone(int p){unique_ptr<int> ret(new int(p));// ...return ret; }
  • 向后兼容:auto_ptr
  • 標準庫的較早版本包含一個名為auto_ptr的類,具有unique_ptr的部分特性,但不是全部,特別是:不能在容器中保存auto_ptr,也不能從函數中返回auto_ptr
  • 雖然auto_ptr是標準庫的一部分,但編寫程序時應該使用unique_ptr
  • 2. 向unique_ptr傳遞刪除器

  • 類似shared_ptr,unique_ptr默認情況下用delete釋放它指向的對象,我們可以重載一個unique_ptr默認的刪除器。
  • 重載的刪除器必須在尖括號中unique_ptr指向類型之后提供刪除器類型,在創建或reset一個unique_ptr類型的對象時,必須提供一個指定類型的可調用對象(刪除器)
  • //p指向一個類型為objT的對象,并使用一個類型為delT的對象釋放objT對象
    //它會調用一個名為fcn的delT類型對象
    unique_ptr<objT, delT> p(new objT, fcn);

    void f(destination &d){connection c = connect(&d); // 打開連接unique_ptr<connection, decltype(end_connection)*> p(&c,end_connection);//使用連接//當f退出時(即使是由于異常而退出),connection會被正常關閉 }
  • decltype用來指明函數指針類型,由于decltype(end_connection)返回一個函數類型,所以需要添加一個*來指出我們正在使用該類型的一個指針。

  • 6. weak_ptr

  • weak_ptr是一種不控制所指向對象生存期的智能指針,指向一個shared_ptr管理的對象。將一個weak_ptr綁定到一個shread_ptr不會改變shared_ptr的引用計數。

  • 一旦最后一個指向對象的shared_ptr被銷毀,對象就會被釋放。即使有weak_ptr指向對象,也會被釋放。

  • weak_ptr表

  • weak_ptr w:空weak_ptr可以指向類型為T的對象
  • weak_ptr w(sp):與shared_ptr sp指向相同對象的weak_ptr,T必須能轉換為sp指向的類型
  • w = p:p可以是一個shared_ptr或一個weak_ptr。賦值后w與p共享對象。
  • w.reset:將w置為空
  • w.use_count:與w共享對象的shared_ptr的數量
  • w.expired():若w.use_count()為0,返回true,否則返回false
  • w.lock:如果expired為true,返回一個空shared_ptr,否則返回一個指向w的對象的shared_ptr
  • 當創建一個weak_ptr時,要用一個shared_ptr來初始化它:

  • auto p = make_shared(42);
    weak_ptr wp§; // wp共享p;p的引用計數未改變

  • wp指向的對象可能被釋放掉,由于對象可能不存在,所以不能使用weak_ptr直接訪問對象,而必須調用lock來檢查weak_ptr指向的對象是否存在,如果存在,lock返回一個指向共享對象的shared_ptr。
  • if(shared_ptr np = wp.lock()){ //如果np不為空則條件成立
    // 在if中,np與p共享對象。
    }

    總結

    以上是生活随笔為你收集整理的C/C++学习之路: 智能指针的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    一区二区三区在线不卡 | 亚洲欧洲日韩 | 色人久久 | 天天看天天干天天操 | 成人动漫一区二区 | 97成人啪啪网 | а天堂中文最新一区二区三区 | 国产原创在线视频 | 色婷婷啪啪免费在线电影观看 | 免费a v在线 | 日本三级在线观看中文字 | 99色亚洲 | 久久久久亚洲精品成人网小说 | 操高跟美女 | 久久精品久久久久 | 992tv又爽又黄的免费视频 | 日韩精品一区二区在线观看 | 91人人爱| 日韩一级成人av | 亚洲涩涩涩| 久草视频99 | 亚洲国产字幕 | 婷婷亚洲五月色综合 | 香蕉久久久久久av成人 | 国产美女主播精品一区二区三区 | 在线视频1卡二卡三卡 | 国产色综合天天综合网 | 中文字幕123区 | 91精品国产91| 午夜av在线免费 | 天天综合入口 | 午夜国产一区 | 国产精品久久伊人 | 99视频在线精品免费观看2 | 欧美日韩不卡一区二区 | 成在线播放 | 天天射天天操天天干 | 国产中文字幕av | 91视频91自拍| 欧美在线91 | 日韩www在线 | 日女人电影 | 日韩精品中文字幕久久臀 | 国产免费三级在线观看 | 免费观看一级视频 | 久草免费手机视频 | 偷拍久久久 | 99免费在线播放99久久免费 | 91专区在线观看 | 91麻豆文化传媒在线观看 | 色午夜 | 中文字幕一区二区三区四区久久 | 中文字幕日韩无 | 97超碰在线久草超碰在线观看 | 国产原创在线视频 | 午夜久久久影院 | 欧美另类高清 videos | 福利视频 | 国产视频久久久久 | 久久久久久久久毛片精品 | 婷婷综合成人 | 黄色在线观看www | 99在线视频播放 | 五月天综合在线 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 日本高清久久久 | 成人在线观看网址 | 国产一级二级av | 亚洲乱亚洲乱亚洲 | 成人三级视频 | aaaaaa毛片| 亚洲精品一区二区18漫画 | 免费大片黄在线 | 久久久免费精品国产一区二区 | 热久久免费国产视频 | 亚洲精品在 | 久青草影院| 国产精品久久久久三级 | 亚洲激情在线观看 | 美女网站黄在线观看 | 欧美日韩不卡在线观看 | h视频日本| 欧美日韩在线免费观看 | 国产免费看| 久久男人中文字幕资源站 | 一区二区三区电影大全 | 中文字幕 国产视频 | www.99av| 久久伊人婷婷 | 久久久91精品国产一区二区三区 | 伊人色综合久久天天 | 91尤物国产尤物福利在线播放 | 国产精品女教师 | 成人一级免费视频 | 亚洲精品综合欧美二区变态 | 国产亚洲精品电影 | 国产精品视频久久 | 欧美一区二区三区在线播放 | 国模视频一区二区三区 | 国内精品久久久久影院一蜜桃 | 91麻豆精品国产91久久久久 | 天天翘av| 日韩成人免费观看 | 欧美精品久久久久 | 麻豆视频www | 6699私人影院 | 国产精品久久99综合免费观看尤物 | 午夜精品一区二区三区可下载 | 99热这里有| 一区二区三区三区在线 | 丁香花中文字幕 | 最新日韩视频在线观看 | 综合网av | 国产精品私人影院 | 偷拍福利视频一区二区三区 | 日韩精品视频久久 | av免费看电影 | 国产一区二区在线精品 | 少妇性色午夜淫片aaaze | 精品人人人人 | 亚洲黄色av| 色综合色综合久久综合频道88 | 日本中文字幕免费观看 | 黄色www免费 | 亚洲黄色一级大片 | 久久天堂精品视频 | 久久av免费| 九九精品久久 | 久久精品美女视频 | 国产激情小视频在线观看 | 91成人精品一区在线播放69 | 久久成人福利 | 亚洲伦理一区二区 | 国产成人av片 | 日韩二区精品 | www日韩视频 | 免费久久片| 四川bbb搡bbb爽爽视频 | 日韩欧美99| 久草9视频 | 黄色成年片| 丁香高清视频在线看看 | 国产成人福利在线 | 91精品电影| 在线激情小视频 | 99热精品免费观看 | 午夜视频黄 | 美女视频久久 | 亚洲一区二区三区毛片 | 午夜美女wwww| 美女网站黄在线观看 | 久久久精品小视频 | 久久国产经典视频 | 99色在线 | 五月丁色| 国产在线观看av | 99精品欧美一区二区蜜桃免费 | 欧美少妇的秘密 | 视频一区二区免费 | 97久久久免费福利网址 | 久久国产精品一区二区三区 | 91视频免费看片 | 久久久精品国产一区二区 | 欧美一区二区三区在线观看 | 91免费网站在线观看 | 在线免费观看国产黄色 | 亚洲三级在线免费观看 | 国产综合精品久久 | 九九久久精品 | 亚洲精品成人av在线 | 成人一级片视频 | 久久国产午夜精品理论片最新版本 | 日韩videos| 成人18视频 | 日韩欧美一区二区三区免费观看 | 国产一二三在线视频 | 免费看网站在线 | 日本精品久久久久中文字幕 | 天天拍天天干 | 久久久久久久久久久久久久电影 | 国产午夜在线观看视频 | 久久精品永久免费 | 精品一区二区三区在线播放 | 久久久久成人精品亚洲国产 | 日本不卡久久 | 天天摸天天操天天舔 | 天天干天天插伊人网 | 亚洲精品视频在线看 | 国产亚洲午夜高清国产拍精品 | 欧美性大战| 欧美综合色在线图区 | 91成人精品一区在线播放69 | 91av在线免费观看 | 波多野结衣在线观看一区 | 中文字幕91 | 美女激情影院 | 久久se视频 | 手机看国产毛片 | 成人在线一区二区三区 | 色精品视频 | 日韩视频www | 日韩剧 | 在线播放 日韩专区 | 九九热精 | 99久久精品国产毛片 | 97热在线观看 | 欧美黄色特级片 | 在线视频欧美亚洲 | 日韩在线免费观看视频 | 97免费在线观看视频 | 四虎国产| 97电影在线| 黄色三级久久 | 欧美最爽乱淫视频播放 | 久久激情片 | 黄色特一级 | 中文久久精品 | 日韩精品在线看 | 黄av资源| 国产在线永久 | 99精品区 | 日本成人黄色片 | 亚洲视屏在线播放 | 国产99久久精品一区二区永久免费 | 久久91久久久久麻豆精品 | 日日爱999 | 日韩精品专区在线影院重磅 | 国产特级毛片 | 99色视频在线 | 亚洲免费色 | 夜夜爱av | 中文字幕91视频 | 久久久久免费电影 | 黄色精品一区 | 精品电影一区 | 欧美一区二区三区在线视频观看 | 亚洲欧洲精品一区二区精品久久久 | 中文字幕第一页av | 97超碰超碰| 天天操,夜夜操 | 天天操人人干 | 免费久草视频 | 婷色在线 | 97视频在线免费 | 在线91av| 日本韩国精品一区二区在线观看 | 国产成人一区二区三区影院在线 | 亚洲首页 | 国产免费影院 | 欧美日韩在线观看一区二区三区 | 亚洲国产精品日韩 | 色99中文字幕 | 久章操| 国产高清久久久久 | 国产一级片一区二区三区 | 中日韩免费视频 | 日韩高清不卡在线 | 欧美成亚洲 | 日韩国产精品久久久久久亚洲 | 国产精选在线 | 亚洲aⅴ一区二区三区 | 999久久 | 91麻豆精品国产91久久久使用方法 | 丝袜av一区 | 午夜视频不卡 | 成人国产精品入口 | 黄色在线观看免费网站 | 97精品国产97久久久久久久久久久久 | 狠狠干狠狠艹 | 四虎最新入口 | 国产成人三级在线观看 | 奇米影视777影音先锋 | 色老板在线 | 91av在线免费观看 | 国产黄色片一级 | 亚洲黄色片在线 | 欧美一级免费黄色片 | 最近更新好看的中文字幕 | 黄色综合 | 国产精品一区二区三区久久 | 久草网在线观看 | 夜色资源站国产www在线视频 | 欧美成人aa | 久久刺激视频 | 午夜视频在线观看一区二区三区 | 四虎免费在线观看视频 | 日韩视频免费看 | 国产一区在线不卡 | 九色在线 | 中文字幕 91 | 一二三精品视频 | 亚洲永久国产精品 | 91亚洲国产成人 | 综合久色| 国产永久免费高清在线观看视频 | 国产一区成人 | 精品一二三四视频 | 日韩欧美成人网 | 美女久久久久久 | 中文字幕资源网 国产 | 国外成人在线视频网站 | 999久久久久久久久 69av视频在线观看 | 中文字幕大全 | 91精选在线观看 | av在线直接看 | 亚洲五月综合 | 午夜在线免费观看视频 | 成人在线观看av | 在线视频中文字幕一区 | 欧美韩国日本在线观看 | 亚洲欧洲一区二区在线观看 | 久草视频手机在线 | 日本精油按摩3 | 一级黄毛片 | 98久9在线 | 免费 | 中文字幕成人在线观看 | 成人精品久久久 | 狠狠狠干狠狠 | 亚洲更新最快 | 69性欧美 | 日韩精品视频免费专区在线播放 | 国产美女视频一区 | 国产女人40精品一区毛片视频 | 国产精品久久久久久久久久99 | 亚洲欧美国产精品18p | 91av视频导航| 欧美精品小视频 | 91丨九色丨国产丨porny精品 | 色丁香婷婷 | 91在线中文字幕 | 探花视频在线观看+在线播放 | 国产精品videossex国产高清 | 91精品久久久久久综合乱菊 | 久久久精品久久日韩一区综合 | 婷婷色六月天 | 天天夜夜亚洲 | 玖玖爱国产在线 | 久久久久国产精品一区 | 国产久草在线观看 | 精品日韩在线 | 99精品福利视频 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 国产成人精品免高潮在线观看 | 欧美日韩不卡在线视频 | 亚洲综合小说电影qvod | 麻豆一二三精选视频 | 伊人五月天综合 | 日韩av影片在线观看 | 国产视频一二区 | 免费在线观看的av网站 | 蜜臀av免费一区二区三区 | 超级碰碰免费视频 | 中文字幕在线播放日韩 | 国产精品一区二区三区99 | 在线观看中文字幕 | 日本黄区免费视频观看 | 91福利试看 | 特级西西444www大精品视频免费看 | 亚州av网站 | 中文字幕一区二 | 成年一级片 | 美女啪啪图片 | 中文字幕在线观看网址 | 日韩中文字幕第一页 | 97色视频在线 | 91看片在线 | 亚洲手机天堂 | 亚洲免费在线视频 | 天天看天天干天天操 | 天天操天天操一操 | 超碰免费观看 | 69av网| 国产一区二区不卡视频 | 国产精品一区久久久久 | 中文字幕国产一区二区 | 国产在线视频在线观看 | 五月天综合激情 | 国产99久久久国产精品免费看 | 99精品黄色片免费大全 | 日韩精品在线观看视频 | 开心激情五月婷婷 | 亚洲欧洲精品久久 | 天堂av在线| 国产精品99久久久久的智能播放 | 1024手机看片国产 | 成人av影院在线观看 | 黄色毛片在线观看 | www天天干| 一级黄色片在线免费看 | 国产成人777777 | 亚洲欧洲精品一区 | 欧美男女爱爱视频 | 99视频偷窥在线精品国自产拍 | 成人免费网站视频 | 免费午夜av | 蜜臀久久99静品久久久久久 | 黄色的视频网站 | 黄色av一区二区三区 | 婷婷丁香五 | 天天色欧美 | 亚洲精品久久久久中文字幕m男 | 欧美成人视 | 国产精品自在欧美一区 | 国产啊v在线观看 | 中文在线免费一区三区 | 夜夜骑日日操 | 日本一区二区免费在线观看 | 狠狠色噜噜狠狠狠合久 | 韩国av在线播放 | 激情久久伊人 | 久久五月情影视 | 在线观看黄网 | 一区二精品 | 欧美夫妻性生活电影 | 日本不卡123区 | 国产一区欧美二区 | 五月婷婷在线视频 | 日本中文在线播放 | 天天操夜夜操夜夜操 | 精品国产1区2区 | 久久九九精品 | 亚州精品在线视频 | 国产糖心vlog在线观看 | 九九九九热精品免费视频点播观看 | 一区二区视频电影在线观看 | 国产美女久久久 | av在线免费播放网站 | 青青草国产在线 | 午夜在线观看影院 | 亚洲国产精品成人精品 | 波多野结衣视频一区二区三区 | 精品二区久久 | 成人三级av | 91女子私密保健养生少妇 | 九九热视频在线播放 | 亚洲乱码国产乱码精品天美传媒 | 精品国产乱码一区二区三区在线 | 99在线观看免费视频精品观看 | 日日天天干 | 国产中文字幕久久 | 天天射天天射天天射 | 中文字幕视频观看 | 黄色a大片| 少妇做爰k8经典 | 一本一本久久a久久 | 成人黄色免费在线观看 | 性色av免费在线观看 | 久久精品视频99 | 日韩高清二区 | 伊人手机在线 | 中文字幕二区在线观看 | 玖玖精品视频 | 国产日产高清dvd碟片 | 国产欧美精品一区二区三区四区 | 久久久久北条麻妃免费看 | 欧美一区二区在线免费观看 | 国产999精品久久久久久绿帽 | 国产精品一区二区免费视频 | 99久久婷婷国产一区二区三区 | 日韩欧美一二三 | 中文字幕一区二区三区四区在线视频 | 亚洲精品456在线播放 | 欧美另类高清 | 国产不卡在线 | 91av美女| 色.www | 久久精品一二三区白丝高潮 | 日日爽夜夜爽 | 国产 视频 高清 免费 | 香蕉视频在线观看免费 | 成人av中文字幕在线观看 | 91原创在线观看 | 久久精品三级 | 久久艹在线观看 | 亚洲精品99久久久久久 | 特级西西444www大精品视频免费看 | 中文字幕一区二区三区视频 | 国产福利网站 | 大型av综合网站 | 国产a级片免费观看 | 日韩av五月天| 狠狠色丁香婷婷综合欧美 | 久久久久久久电影 | 丁香花在线观看视频在线 | 亚洲成人资源在线 | 在线观看免费高清视频大全追剧 | 中文字幕精品久久 | 国产小视频91 | 九九亚洲视频 | 国产亚洲精品久久久网站好莱 | 丁香六月婷婷 | 久久久精品国产一区二区电影四季 | 在线免费观看一区二区三区 | 欧美激情va永久在线播放 | 色婷婷综合久久久中文字幕 | 东方av在 | 日日干天天爽 | 少妇bbb搡bbbb搡bbbb′ | 91精品一 | 中文字幕三区 | 97视频在线观看网址 | 91黄视频在线 | 91精品在线看 | 人人爽人人乐 | 在线精品视频免费播放 | 五月婷综合 | 国产精品麻豆三级一区视频 | 综合天天色 | 中文字幕字幕中文 | 欧美在线视频不卡 | 久久综合综合久久综合 | 日韩av专区| 日本精品视频一区 | 久久亚洲欧美日韩精品专区 | 九九九热精品 | 天天射综合网视频 | 国产亚洲人 | 精品一区精品二区 | 麻豆一精品传二传媒短视频 | 中文字幕 二区 | 日本精品视频一区 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 五月婷婷六月丁香 | 精品视频在线播放 | 中文字幕在线看片 | 日韩在线视频线视频免费网站 | 免费福利小视频 | 国产麻豆果冻传媒在线观看 | 亚洲区视频在线观看 | 91成人精品视频 | 人人澡人人干 | 黄色一级在线免费观看 | 青草视频在线免费 | 精品在线二区 | 久久亚洲精品国产亚洲老地址 | 欧美另类z0zx | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 亚洲国产美女久久久久 | 99精品视频在线 | 日韩艹 | 免费看黄色毛片 | 亚洲精品玖玖玖av在线看 | 大荫蒂欧美视频另类xxxx | 国产在线精品一区二区三区 | 99视频精品全国免费 | 日韩av成人在线观看 | 香蕉久草 | 欧美日韩国产精品一区二区三区 | 欧美精品久久久久久 | 欧美日韩中文在线观看 | 综合久久精品 | 久久精品国产精品亚洲 | 国产韩国日本高清视频 | 亚洲一区天堂 | 国产麻豆果冻传媒在线观看 | 亚洲一区二区高潮无套美女 | 99精品免费网 | 欧美日韩一级久久久久久免费看 | 国产色小视频 | 欧美综合国产 | 日韩和的一区二在线 | 93久久精品日日躁夜夜躁欧美 | 亚洲视频一区二区三区在线观看 | 特级毛片爽www免费版 | 天天干,天天操,天天射 | 在线91av| 18av在线视频 | 色美女在线 | 国语精品久久 | 久久99热精品 | 亚洲日本黄色 | 81国产精品久久久久久久久久 | 精品国内自产拍在线观看视频 | 亚洲国产成人精品电影在线观看 | 国内亚洲精品 | 成人h动漫在线看 | 一区三区视频 | www免费 | 女人18片| 日韩视频 一区 | 日韩高清国产精品 | 久久在线视频在线 | 91中文字幕在线观看 | 免费十分钟 | 久久桃花网 | 国产精品6999成人免费视频 | 麻豆国产在线播放 | 亚洲在线视频观看 | 亚洲国产97在线精品一区 | 天天综合天天做天天综合 | 免费看黄在线网站 | 人人爽久久涩噜噜噜网站 | 色在线网站 | 日韩精品91偷拍在线观看 | www黄色av | 亚洲视频在线看 | 99久久99久久精品国产片果冰 | 成人免费视频a | 亚洲在线视频免费 | 久久精品99精品国产香蕉 | 欧美日韩国产xxx | av在线等| 国产在线最新 | 久久精品99国产精品日本 | 999精品网 | 国产精品九九久久久久久久 | 在线免费观看国产精品 | 国产91成人在在线播放 | 久草在线免费色站 | 精品在线免费视频 | 永久免费精品视频 | 欧美激情第一区 | 天天综合网 天天综合色 | 最近最新中文字幕视频 | 精品国产一二三 | 欧美成人xxxx| 欧美在一区 | 亚洲国产网站 | 成人免费在线看片 | 色婷婷综合久久久久中文字幕1 | 欧美国产日韩在线观看 | 一级淫片a | 色天天 | 亚洲精品午夜aaa久久久 | 国产精品色 | 婷香五月 | 国产精品1区2区在线观看 | 日本一区二区免费在线观看 | 国产精品一区免费看8c0m | 99精品热视频只有精品10 | 狠狠综合久久av | 日韩精品久久久久久久电影竹菊 | 激情五月婷婷丁香 | 黄色a级片在线观看 | 在线观看视频你懂得 | 五月婷婷激情六月 | 麻豆一区在线观看 | 日韩电影久久 | 性色av一区二区三区在线观看 | 久久久久综合精品福利啪啪 | 国产九九九九九 | 激情亚洲综合在线 | 精品99999 | 高潮久久久久久久久 | 香蕉视频国产在线观看 | 狠狠狠狠狠狠狠干 | 中文字幕黄色av | 欧美精品久久99 | 日日夜夜噜噜噜 | 人人澡人人模 | 色偷偷网站视频 | 99精品视频精品精品视频 | 亚洲禁18久人片 | 又黄又爽又色无遮挡免费 | 国产成人在线精品 | 99久久久久久久久久 | 精品久久久久久国产 | 亚州精品天堂中文字幕 | 一级黄色在线免费观看 | 久久综合九色综合久久久精品综合 | 在线看片日韩 | 亚洲精品久 | 久久精品波多野结衣 | 色六月婷婷| 欧美一级片在线播放 | 一区二区视频欧美 | 最新国产视频 | 中文字幕在线视频网站 | 国内成人av| 国产无遮挡又黄又爽馒头漫画 | 国产精品成人av电影 | 麻豆精品传媒视频 | 久久精品99国产 | 7777精品伊人久久久大香线蕉 | 99在线观看免费视频精品观看 | 91麻豆国产 | 成人在线黄色电影 | 国产一级视频在线观看 | 久久综合之合合综合久久 | 中字幕视频在线永久在线观看免费 | 91免费视频网站在线观看 | 久久99久久99精品中文字幕 | 免费观看一区二区三区视频 | 午夜精品麻豆 | 欧美日韩精品在线播放 | 超碰97免费 | 亚洲首页 | 波多野结衣视频在线 | 91少妇精拍在线播放 | av免费在线网站 | 日韩伦理片hd| 国产精品久久久久久久久久久久午夜 | 亚洲欧洲美洲av | 99久久久久久国产精品 | 国产精品日韩久久久久 | 亚洲电影久久久 | 亚洲国产欧洲综合997久久, | 久久经典国产视频 | 91成人午夜 | www.夜夜操.com| 在线黄网站 | 久久久精品国产免费观看一区二区 | 欧美极品少妇xbxb性爽爽视频 | 精品国产一区二区三区蜜臀 | 国产一区二区午夜 | 国产精品影音先锋 | 日韩免费在线看 | 手机版av在线 | 久草网站在线观看 | 欧美精品久久久久久久久久白贞 | 中文字幕在线播放av | 波多野结衣一区二区三区中文字幕 | 蜜臀av性久久久久av蜜臀三区 | 深夜免费网站 | 中日韩在线 | 国内精品久久久久久久久久清纯 | 欧美激情综合网 | 色成人亚洲 | 在线电影中文字幕 | 久久黄色免费视频 | 香蕉网在线播放 | 亚洲精品456在线播放乱码 | 欧美色图30p | 欧美一级免费黄色片 | 91视频最新网址 | 久草资源免费 | 97超碰人 | 日日麻批40分钟视频免费观看 | 最新国产在线视频 | 国产91学生粉嫩喷水 | 天天做天天爽 | 久久有精品 | 欧美日韩3p | 久久久精品国产免费观看一区二区 | 免费观看av网站 | 国产成人亚洲在线观看 | 九九有精品 | 中文字幕成人 | 在线免费观看av网站 | 涩涩在线 | 国产精品1024 | 日韩av成人免费看 | 国产午夜精品av一区二区 | 欧美 日韩 国产 成人 在线 | 99精彩视频在线观看免费 | 久久人人爽视频 | 99综合久久 | 最近高清中文在线字幕在线观看 | 91成人在线视频观看 | 一区二区精品国产 | 久久试看 | 免费亚洲黄色 | 97在线视频免费 | 免费高清看电视网站 | 日日爱网站 | 涩涩网站在线播放 | 麻豆视频免费入口 | 人人爽人人搞 | 久久不卡国产精品一区二区 | 在线免费观看黄色大片 | 亚洲国产mv | 黄色成年片 | 亚洲综合最新在线 | 波多野结衣视频一区 | 国产精品免费观看在线 | 在线一区av | 中文字幕亚洲国产 | 日本资源中文字幕在线 | 日韩高清久久 | 蜜桃av久久久亚洲精品 | 国产99久久久国产精品免费二区 | 一区二区影院 | 视频国产精品 | 久精品在线观看 | 天天躁天天躁天天躁婷 | 亚洲 欧洲 国产 精品 | 美女网站视频色 | 久草国产视频 | 超碰在线观看av.com | 亚洲好视频 | 免费国产黄线在线观看视频 | 久久99国产精品视频 | 欧美亚洲xxx | 午夜精品一区二区三区四区 | 91色网址 | 六月色婷| 毛片网在线播放 | 日本精品视频一区 | 亚洲一二区视频 | www.xxxx变态.com | 九九九九热精品免费视频点播观看 | 亚洲精品视频播放 | 国产在线日韩 | 国产96精品 | 99在线精品视频观看 | 日p在线观看 | 国产一区二区在线免费播放 | 97超视频 | 91最新地址永久入口 | 亚洲最新合集 | 日韩乱理| 色综合久久88色综合天天 | 国产成人精品在线播放 | 99热这里有 | 18久久久久 | 国产小视频在线免费观看 | av免费网页 | 亚洲视频1 | 91麻豆精品国产 | 欧美肥妇free | 91久久久久久国产精品 | 婷婷久久综合九色综合 | 精品久久久久久亚洲 | 国产精品网站一区二区三区 | 人人草天天草 | 亚洲成人高清在线 | 97色综合| 欧美激情h | 日韩中文字幕第一页 | 97日日碰人人模人人澡分享吧 | 日韩在线二区 | 久久精品一 | 国产精品第一视频 | 成人亚洲综合 | 日韩激情视频 | 久久国产露脸精品国产 | 伊人天堂网 | 992tv在线观看网站 | 亚洲色图 校园春色 | 综合国产在线 | 午夜婷婷在线观看 | 午夜丁香视频在线观看 | 日韩在线激情 | 日本护士三级少妇三级999 | 99草视频 | 国产成人精品免费在线观看 | 日日夜夜天天操 | 国产一区在线视频观看 | 久久综合色影院 | 玖玖爱在线观看 | 欧美一级性视频 | 日韩国产精品久久 | 99精品国产一区二区 | 日日草夜夜操 | 国产美女网站视频 | 五月婷香 | 亚洲激情影院 | 久久精品网站免费观看 | 在线观看av片 | 久久视频免费观看 | 亚洲激情小视频 | 夜色成人av | 手机色在线 | 免费网站在线观看成人 | 日韩视频a | 欧美一区二区三区激情视频 | 国产资源| 色综合天天视频在线观看 | 久久一区国产 | 日日射天天射 | 女人高潮一级片 | 久草在线视频首页 | 亚洲 精品在线视频 | 国产精品色婷婷 | 久久国产亚洲视频 | 在线韩国电影免费观影完整版 | 久久精品视频在线观看免费 | 婷婷综合久久 | 日韩精品在线观看av | 欧美日韩99 | 国产精品99久久久久人中文网介绍 | 亚洲黄色小说网 | 日日天天| 欧美ⅹxxxxxx | 国产精品成人a免费观看 | 九九热免费在线视频 | 久久a v视频| 四虎成人精品 | 欧美另类调教 | 国产.精品.日韩.另类.中文.在线.播放 | 亚洲精品免费在线观看 | 99免费在线播放99久久免费 | 婷婷精品在线视频 | 韩国av免费观看 | 国产我不卡 | 国产精品ssss在线亚洲 | 婷婷成人亚洲综合国产xv88 | 96av麻豆蜜桃一区二区 | 久久国产视频网站 | 热久久电影 | 最近中文字幕大全中文字幕免费 | 亚洲精品成人 | 婷婷久操 | 亚洲视频aaa| 久久久久久久久毛片 | 国产免费一区二区三区最新 | 久久99国产精品久久99 | 最近免费中文字幕mv在线视频3 | 涩av在线 | 五月天丁香视频 | 色噜噜日韩精品一区二区三区视频 | 国产高清不卡 | 国产精品自产拍 | 91成人免费在线 | 国产一区二区不卡视频 | 伊人永久 | 国产四虎影院 | 欧洲精品在线视频 | 人人舔人人舔 | 久久成人毛片 | 免费日韩av电影 | 久99久中文字幕在线 | 日本女人在线观看 | 亚洲第一中文字幕 | 日韩av电影免费观看 | 欧美极品裸体 | 久久久久免费精品国产 | 免费观看一区二区三区视频 | 国产福利一区二区在线 | 中文字幕在线播出 | 欧美巨乳波霸 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲成人在线免费 | 日本女人的性生活视频 | 国产亚洲综合在线 | 极品嫩模被强到高潮呻吟91 | 91视频91自拍 | 激情网第四色 | 国产精品嫩草影院9 | 国产视频在线免费观看 | 东方av免费在线观看 | 久久久麻豆精品一区二区 | 亚洲精品大全 | 一性一交视频 | www.婷婷com| 欧美精品久久久久久久免费 | 97超级碰碰碰碰久久久久 | 欧美日本啪啪无遮挡网站 | 97视频亚洲| 最新日韩在线 | 亚洲婷婷免费 | 色婷婷99| 九九热免费在线视频 | 99精品视频精品精品视频 | 日本二区三区在线 | 国产成人精品国内自产拍免费看 | 97视频在线观看视频免费视频 | 日本福利视频在线 | 久久久久国产精品免费 | 亚洲精品视频大全 | 在线观看91av | 最新免费av在线 | 久久久久久久综合色一本 | 欧美一级艳片视频免费观看 | 操少妇视频| 国产精品免费一区二区三区 | 九九热在线观看 | 日韩中文在线播放 | 日日夜av| 日韩精品久久久久 | 久久久久久久久电影 | www.五月天 | 中文字幕电影在线 | 久久久久久综合网天天 | 91久久精品一区 | 国产精品初高中精品久久 | 色午夜| 日韩高清一区二区 | 97av在线视频免费播放 | 国产免费一区二区三区最新6 | 欧美特一级 | www.夜夜爽| 中文字幕日韩无 | 亚洲一区二区三区在线看 | 国产97在线视频 | 欧美在线视频一区二区三区 | av在线免费在线观看 | 久久理伦片 | 国产一及片 | 国产亚洲永久域名 | 亚洲影院色 | 91视频免费看网站 | 婷婷丁香花 | 国产高清福利在线 | 国产成人精品一区二区三区福利 | 日韩三级精品 | 精品久久久久久久久久久久久久久久久久 | 黄色网www| 国产精品白浆视频 | 91精品推荐| 成年美女黄网站色大片免费看 | 亚洲国产精品99久久久久久久久 | 日韩精品久久久久久 | 亚洲免费不卡 | 中文字幕第一页在线vr | 最新中文在线视频 | 久久公开免费视频 | 精品不卡视频 |