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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【Smart_Point】C/C++ 中智能指针

發布時間:2023/11/27 生活经验 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Smart_Point】C/C++ 中智能指针 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++11智能指針

目錄

C++11智能指針

1.1 C++11智能指針介紹

1.2 為什么要使用智能指針

1.2.1 auto_ptr(C++98的方案,C++11已經拋棄)采用所有權模式。

1.2.2 unique_ptr

1.2.3 shared_ptr

1.2.4 weak_ptr

1.3 share_ptr和weak_ptr的核心實現

1.3.1 Counter簡單實現

1.3.2 share_ptr的簡單實現

1.3.3 weak_ptr簡單實現

1.4 分清楚場合應該使用哪種類型的智能指針;


C++里面的四個智能指針: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三個是C++11支持,并且第一個已經被C++11棄用。

1.1 C++11智能指針介紹

智能指針主要用于管理在堆上分配的內存,它將普通的指針封裝為一個棧對象。當棧對象的生存周期結束后,會在析構函數中釋放掉申請的內存,從而防止內存泄漏。C++ 11中最常用的智能指針類型為shared_ptr,它采用引用計數的方法,記錄當前內存資源被多少個智能指針引用。該引用計數的內存在堆上分配。當新增一個時引用計數加1,當過期時引用計數減一。只有引用計數為0時,智能指針才會自動釋放引用的內存資源。對shared_ptr進行初始化時不能將一個普通指針直接賦值給智能指針,因為一個是指針,一個是類。可以通過make_shared函數或者通過構造函數傳入普通指針。并可以通過get函數獲得普通指針。

1.2 為什么要使用智能指針

智能指針的作用是管理一個指針,因為存在以下這種情況:申請的空間在函數結束時忘記釋放,造成內存泄漏。使用智能指針可以很大程度上的避免這個問題,因為智能指針是一個類,當超出了類的實例對象的作用域時,會自動調用對象的析構函數,析構函數會自動釋放資源。所以智能指針的作用原理就是在函數結束時自動釋放內存空間,不需要手動釋放內存空間。

1.2.1 auto_ptr(C++98的方案,C++11已經拋棄)采用所有權模式。

auto_ptr<string> p1 (new string ("I reigned lonely as a cloud.")); 
auto_ptr<string> p2; 
p2 = p1; //auto_ptr不會報錯.

此時不會報錯,p2剝奪了p1的所有權,但是當程序運行時訪問p1將會報錯。所以auto_ptr的缺點是:存在潛在的內存崩潰問題!

std::auto_ptr 真正讓人容易誤用的地方是其不常用的復制語義,即當復制一個 std::auto_ptr 對象時(拷貝復制或 operator = 復制),原對象所持有的堆內存對象也會轉移給復制出來的對象。示例代碼如下:

#include <iostream>
#include <memory>
?
int main()
{//測試拷貝構造std::auto_ptr<int> sp1(new int(8));std::auto_ptr<int> sp2(sp1);if (sp1.get() != NULL){std::cout << "sp1 is not empty." << std::endl;}else{std::cout << "sp1 is empty." << std::endl;}
?if (sp2.get() != NULL){std::cout << "sp2 is not empty." << std::endl;}else{std::cout << "sp2 is empty." << std::endl;}
?//測試賦值構造std::auto_ptr<int> sp3(new int(8));std::auto_ptr<int> sp4;sp4 = sp3;if (sp3.get() != NULL){std::cout << "sp3 is not empty." << std::endl;}else{std::cout << "sp3 is empty." << std::endl;}
?if (sp4.get() != NULL){std::cout << "sp4 is not empty." << std::endl;}else{std::cout << "sp4 is empty." << std::endl;}
?return 0;
}

上述代碼中分別利用拷貝構造(sp1 => sp2)和 賦值構造(sp3 => sp4)來創建新的 std::auto_ptr 對象,因此 sp1 持有的堆對象被轉移給 sp2,sp3 持有的堆對象被轉移給 sp4。我們得到程序執行結果如下:

[root@iZ238vnojlyZ testx]# g++ -g -o test_auto_ptr test_auto_ptr.cpp
[root@iZ238vnojlyZ testx]# ./test_auto_ptr 
sp1 is empty.
sp2 is not empty.
sp3 is empty.
sp4 is not empty.

由于 std::auto_ptr 這種不常用的復制語義,我們應該避免在 stl 容器中使用 std::auto_ptr,例如我們絕不應該寫出如下代碼:

std::vector<std::auto_ptr<int>> myvectors;

當用算法對容器操作的時候(如最常見的容器元素遍歷),很難避免不對容器中的元素實現賦值傳遞,這樣便會使容器中多個元素被置為空指針,這不是我們想看到的,會造成很多意想不到的錯誤。

以史為鑒,作為 std::auto_ptr 的替代者 std::unique_ptr 吸取了這個經驗教訓。下文會來詳細介紹。

正因為 std::auto_ptr 的設計存在如此重大缺陷,C++11 標準在充分借鑒和吸收了 boost 庫中智能指針的設計思想,引入了三種類型的智能指針,即 std::unique_ptrstd::shared_ptrstd::weak_ptr

boost 還有 scoped_ptr,C++11 并沒有全部照搬,而是選擇了三個最實用的指針類型。在 C++11 中可以通過 std::unique_ptr 達到與 boost::scoped_ptr 一樣的效果。

1.2.2 unique_ptr

(替換auto_ptrunique_ptr實現獨占式擁有或嚴格擁有概念,保證同一時間內只有一個智能指針可以指向該對象。它對于避免資源泄露(例如“以new創建對象后因為發生異常而忘記調用delete”)特別有用。 與shared_ptr不同,某一時刻,只能有一個unique_ptr指向一個給定的對象。因此,當unique_ptr被銷毀,它所指的對象也會被銷毀。

std::unique_ptr 對其持有的堆內存具有唯一擁有權,也就是說引用計數永遠是 1,std::unique_ptr 對象銷毀時會釋放其持有的堆內存。可以使用以下方式初始化一個 std::unique_ptr 對象:

//初始化方式1
std::unique_ptr<int> sp1(new int(123));
?
//初始化方式2
std::unique_ptr<int> sp2;
sp2.reset(new int(123));
?
//初始化方式3
std::unique_ptr<int> sp3 = std::make_unique<int>(123);
你應該盡量使用初始化方式 3 的方式去創建一個 std::unique_ptr 而不是方式 1 和 2,因為形式 3 更安全,原因 Scott Meyers 在其《Effective Modern C++》中已經解釋過了,有興趣的讀者可以閱讀此書相關章節。

令很多人對 C++11 規范不滿的地方是,C++11 新增了 std::make_shared() 方法創建一個 std::shared_ptr 對象,卻沒有提供相應的 std::make_unique() 方法創建一個 std::unique_ptr 對象,這個方法直到 C++14 才被添加進來。當然,在 C++11 中你很容易實現出這樣一個方法來:

template<typename T, typename... Ts>
std::unique_ptr<T> make_unique(Ts&& ...params)
{return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
}

鑒于 std::auto_ptr 的前車之鑒,std::unique_ptr 禁止復制語義,為了達到這個效果,std::unique_ptr 類的拷貝構造函數和賦值運算符(operator =)被標記為 delete

template <class T>
class unique_ptr
{//省略其他代碼...
?//拷貝構造函數和賦值運算符被標記為deleteunique_ptr(const unique_ptr&) = delete;unique_ptr& operator=(const unique_ptr&) = delete;
};//禁止拷貝復制和operattor=復制,允許所有權轉移

因此,下列代碼是無法通過編譯的:

std::unique_ptr<int> sp1(std::make_unique<int>(123));;
?
//以下代碼無法通過編譯
//std::unique_ptr<int> sp2(sp1);
std::unique_ptr<int> sp3;
//以下代碼無法通過編譯
//sp3 = sp1;

禁止復制語義也存在特例,即可以通過一個函數返回一個 std::unique_ptr:

#include <memory>std::unique_ptr<int> func(int val)
{std::unique_ptr<int> up(new int(val));return up;
}int main()
{std::unique_ptr<int> sp1 = func(123);return 0;
}

上述代碼從 func 函數中得到一個 std::unique_ptr 對象,然后返回給 sp1。

既然 std::unique_ptr 不能復制,那么如何將一個 std::unique_ptr 對象持有的堆內存轉移給另外一個呢?答案是使用移動構造,示例代碼如下

#include <memory>int main()
{std::unique_ptr<int> sp1(std::make_unique<int>(123));std::unique_ptr<int> sp2(std::move(sp1));std::unique_ptr<int> sp3;sp3 = std::move(sp2);return 0;
}

以上代碼利用 std::move 將 sp1 持有的堆內存(值為 123)轉移給 sp2,再把 sp2 轉移給 sp3。最后,sp1 和 sp2 不再持有堆內存的引用,變成一個空的智能指針對象。并不是所有的對象的 std::move 操作都有意義,只有實現了移動構造函數(Move Constructor)或移動賦值運算符(operator =)的類才行,而 std::unique_ptr 正好實現了這二者,以下是實現偽碼:

template<typename T, typename Deletor>
class unique_ptr
{//其他函數省略...
public:unique_ptr(unique_ptr&& rhs){this->m_pT = rhs.m_pT;//源對象釋放rhs.m_pT = nullptr;}unique_ptr& operator=(unique_ptr&& rhs){this->m_pT = rhs.m_pT;//源對象釋放rhs.m_pT = nullptr;return *this;}private:T*    m_pT;
};

這是 std::unique_ptr 具有移動語義的原因。

std::unique_ptr 不僅可以持有一個堆對象,也可以持有一組堆對象,示例如下:

#include <iostream>
#include <memory>int main()
{//創建10個int類型的堆對象//形式1std::unique_ptr<int[]> sp1(new int[10]);//形式2std::unique_ptr<int[]> sp2;sp2.reset(new int[10]);//形式3std::unique_ptr<int[]> sp3(std::make_unique<int[]>(10));for (int i = 0; i < 10; ++i){sp1[i] = i;sp2[i] = i;sp3[i] = i;}for (int i = 0; i < 10; ++i){std::cout << sp1[i] << ", " << sp2[i] << ", " << sp3[i] << std::endl;}return 0;
}

程序執行結果如下:

0, 0, 0
1, 1, 1
2, 2, 2
3, 3, 3
4, 4, 4
5, 5, 5
6, 6, 6
7, 7, 7
8, 8, 8
9, 9, 9

std::shared_ptrstd::weak_ptr 也可以持有一組堆對象,用法與 std::unique_ptr 相同,下文不再贅述。

采用所有權模式,還是上面那個例子

unique_ptr<string> p3 (new string ("auto"));   //#4
unique_ptr<string> p4;                        //#5
p4 = p3;//此時會報錯!!

編譯器認為p4=p3非法,避免了p3不再指向有效數據的問題。嘗試復制p3時會編譯期出錯,而auto_ptr能通過編譯期從而在運行期埋下出錯的隱患。因此,unique_ptrauto_ptr更安全。

另外unique_ptr還有更聰明的地方:當程序試圖將一個 unique_ptr 賦值給另一個時,如果源 unique_ptr 是個臨時右值,編譯器允許這么做;如果源 unique_ptr 將存在一段時間,編譯器將禁止這么做,比如:

unique_ptr<string> pu1(new string ("hello world")); 
unique_ptr<string> pu2; 
pu2 = pu1;                                      // #1 不允許
unique_ptr<string> pu3; 
pu3 = unique_ptr<string>(new string ("You"));   // #2 允許

其中#1留下懸掛的unique_ptr(pu1),這可能導致危害。而#2不會留下懸掛的unique_ptr,因為它調用 unique_ptr 的構造函數,該構造函數創建的臨時對象在其所有權讓給 pu3 后就會被銷毀。這種隨情況而已的行為表明,unique_ptr 優于允許兩種賦值的auto_ptr

注:如果確實想執行類似與#1的操作,要安全的重用這種指針,可給它賦新值。C++有一個標準庫函數std::move(),讓你能夠將一個unique_ptr賦給另一個。盡管轉移所有權后 還是有可能出現原有指針調用(調用就崩潰)的情況。但是這個語法能強調你是在轉移所有權,讓你清晰的知道自己在做什么,從而不亂調用原有指針。

額外:boost庫的boost::scoped_ptr也是一個獨占性智能指針,但是它不允許轉移所有權,從始而終都只對一個資源負責,它更安全謹慎,但是應用的范圍也更狹窄。

unique_ptr<string> ps1, ps2;
ps1 = demo("hello");
ps2 = move(ps1);
ps1 = demo("alexia");
cout << *ps2 << *ps1 << endl;

1.2.3 shared_ptr

shared_ptr實現共享式擁有概念。多個智能指針可以指向相同對象,該對象和其相關資源會在“最后一個引用被銷毀”時候釋放。從名字share就可以看出了資源可以被多個指針共享,它使用計數機制來表明資源被幾個指針共享。可以通過成員函數use_count()來查看資源的所有者個數。除了可以通過new來構造,還可以通過傳入auto_ptr, unique_ptr,weak_ptr來構造。當我們調用release()時,當前指針會釋放資源所有權,計數減一。當計數等于0時,資源會被釋放。

td::unique_ptr 對其持有的資源具有獨占性,而 std::shared_ptr 持有的資源可以在多個 std::shared_ptr 之間共享,每多一個 std::shared_ptr 對資源的引用,資源引用計數將增加 1,每一個指向該資源的 std::shared_ptr 對象析構時,資源引用計數減 1,最后一個 std::shared_ptr 對象析構時,發現資源計數為 0,將釋放其持有的資源。多個線程之間,遞增和減少資源的引用計數是安全的。(注意:這不意味著多個線程同時操作 std::shared_ptr 引用的對象是安全的)。std::shared_ptr 提供了一個 use_count() 方法來獲取當前持有資源的引用計數。除了上面描述的,std::shared_ptr 用法和 std::unique_ptr 基本相同。

shared_ptr 是為了解決 auto_ptr 在對象所有權上的局限性(auto_ptr 是獨占的), 在使用引用計數的機制上提供了可以共享所有權的智能指針。

成員函數:

std::shared_ptr<int> sp1(new int(123));
//
std::shared_ptr<int> sp2;
sp2.reset(new int(123));
//
std::shared+ptr<int> sp3;
sp3=std::make_shared<int>(123);

std::unique_ptr 一樣,你應該優先使用 std::make_shared 去初始化一個 std::shared_ptr 對象。

再來看另外一段代碼:

#include <iostream>
#include <memory>class A
{
public:A(){std::cout << "A constructor" << std::endl;}~A(){std::cout << "A destructor" << std::endl;}
};int main()
{{//初始化方式1std::shared_ptr<A> sp1(new A());std::cout << "sp1 use count: " << sp1.use_count() << std::endl;//初始化方式2std::shared_ptr<A> sp2(sp1);std::cout << "sp2 use count: " << sp1.use_count() << std::endl;sp2.reset();std::cout << "sp2 reset use count: " << sp1.use_count() << std::endl;{std::shared_ptr<A> sp3 = sp1;std::cout << "sp3 = sp1 use count: " << sp1.use_count() << std::endl;}std::cout << "use count: " << sp1.use_count() << std::endl;}return 0;
}
  • 上述代碼 22 行 sp1 構造時,同時觸發對象 A 的構造,因此 A 的構造函數會執行;

  • 此時只有一個 sp1 對象引用 22 行 new 出來的 A 對象(為了敘述方便,下文統一稱之為資源對象 A),因此代碼 24 行打印出來的引用計數值為 1

  • 代碼 27 行,利用 sp1 拷貝一份 sp2,導致代碼 28 行打印出來的引用計數為 2

  • 代碼 30 行調用 sp2 的 reset() 方法,sp2 釋放對資源對象 A 的引用,因此代碼 31 行打印的引用計數值再次變為 1

  • 代碼 34 行 利用 sp1 再次 創建 sp3,因此代碼 35 行打印的引用計數變為 2

  • 程序執行到 36 行以后,sp3 出了其作用域被析構,資源 A 的引用計數遞減 1,因此 代碼 38 行打印的引用計數為 1

  • 程序執行到 39 行以后,sp1 出了其作用域被析構,在其析構時遞減資源 A 的引用計數至 0,并析構資源 A 對象,因此類 A 的析構函數被調用。

    A constructor
    sp1 use count: 1
    sp2 use count: 2
    sp2 reset use count: 1
    sp3 = sp1 use count: 2
    use count: 1
    A destructor
    

所以整個程序的執行結果如下:

use_count 返回引用計數的個數unique 返回是否是獨占所有權( use_count 為 1)swap 交換兩個 `shared_ptr` 對象(即交換所擁有的對象)reset 放棄內部對象的所有權或擁有對象的變更, 會引起原有對象的引用計數的減少get 返回內部對象(指針), 由于已經重載了()方法, 因此和直接使用對象是一樣的.如
shared_ptr<int> sp(new int(1)); 

spsp.get()是等價的。

share_ptr的簡單例子:

int main()
{string *s1 = new string("s1");shared_ptr<string> ps1(s1);shared_ptr<string> ps2;ps2 = ps1;cout << ps1.use_count()<<endl;	//2cout<<ps2.use_count()<<endl;	//2cout << ps1.unique()<<endl;		//0string *s3 = new string("s3");shared_ptr<string> ps3(s3);cout << (ps1.get()) << endl;	//033AEB48cout << ps3.get() << endl;		//033B2C50swap(ps1, ps3);				//交換所擁有的對象cout << (ps1.get())<<endl;	//033B2C50cout << ps3.get() << endl;	//033AEB48cout << ps1.use_count()<<endl;		//1cout << ps2.use_count() << endl;	//2ps2 = ps1;cout << ps1.use_count()<<endl;		//2cout << ps2.use_count() << endl;	//2ps1.reset();	//放棄ps1的擁有權,引用計數的減少cout << ps1.use_count()<<endl;	//0cout << ps2.use_count()<<endl;	//1
}

1.2.4 weak_ptr

share_ptr雖然已經很好用了,但是有一點share_ptr智能指針還是有內存泄露的情況,當兩個對象相互使用一個shared_ptr成員變量指向對方,會造成循環引用,使引用計數失效,從而導致內存泄漏。

weak_ptr 是一種不控制對象生命周期的智能指針, 它指向一個 shared_ptr 管理的對象. 進行該對象的內存管理的是那個強引用的shared_ptrweak_ptr只是提供了對管理對象的一個訪問手段。weak_ptr 設計的目的是為配合 shared_ptr 而引入的一種智能指針來協助 shared_ptr 工作, 它只可以從一個 shared_ptr 或另一個 weak_ptr 對象構造, 它的構造和析構不會引起引用記數的增加或減少weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果說兩個shared_ptr相互引用,那么這兩個指針的引用計數永遠不可能下降為0,資源永遠不會釋放。它是對對象的一種弱引用,不會增加對象的引用計數,和shared_ptr之間可以相互轉化,shared_ptr可以直接賦值給它,它可以通過調用lock函數來獲得shared_ptr

class B;	//聲明
class A
{
public:shared_ptr<B> pb_;~A(){cout << "A delete\n";}
};class B
{
public:shared_ptr<A> pa_;~B(){cout << "B delete\n";}
};void fun()
{shared_ptr<B> pb(new B());shared_ptr<A> pa(new A());cout << pb.use_count() << endl;	//1cout << pa.use_count() << endl;	//1pb->pa_ = pa;pa->pb_ = pb;cout << pb.use_count() << endl;	//2cout << pa.use_count() << endl;	//2
}int main()
{fun();return 0;
}

可以看到fun函數中pa ,pb之間互相引用,兩個資源的引用計數為2,當要跳出函數時,智能指針pa,pb析構時兩個資源引用計數會減1,但是兩者引用計數還是為1,導致跳出函數時資源沒有被釋放(A、B的析構函數沒有被調用)運行結果沒有輸出析構函數的內容,造成內存泄露。如果把其中一個改為weak_ptr就可以了,我們把類A里面的shared_ptr pb,改為weak_ptr`pb` ,運行結果如下:

1
1
1
2
B delete
A delete

這樣的話,資源B的引用開始就只有1,當pb析構時,B的計數變為0,B得到釋放,B釋放的同時也會使A的計數減1,同時pa析構時使A的計數減1,那么A的計數為0,A得到釋放。

注意:我們不能通過weak_ptr直接訪問對象的方法,比如B對象中有一個方法print(),我們不能這樣訪問,pa->pb_->print(),因為pb_是一個weak_ptr,應該先把它轉化為shared_ptr,如:

shared_ptr<B> p = pa->pb_.lock();
p->print();

weak_ptr 沒有重載*和->但可以使用 lock 獲得一個可用的 shared_ptr 對象. 注意, weak_ptr 在使用前需要檢查合法性.

expired 用于檢測所管理的對象是否已經釋放, 如果已經釋放, 返回 true; 否則返回 false.

lock 用于獲取所管理的對象的強引用(shared_ptr). 如果 expired 為 true, 返回一個空的 shared_ptr; 否則返回一個 shared_ptr, 其內部對象指向與 weak_ptr 相同.

use_count 返回與 shared_ptr 共享的對象的引用計數.

reset 將 weak_ptr 置空.

weak_ptr 支持拷貝或賦值, 但不會影響對應的 shared_ptr 內部對象的計數.

1.3 share_ptrweak_ptr的核心實現

weak_ptr的作為弱引用指針,其實現依賴于counter的計數器類和share_ptr的賦值,構造,所以先把counter和share_ptr簡單實現

1.3.1 Counter簡單實現

class Counter
{
public:Counter() : s(0), w(0){};int s;	//share_ptr的引用計數int w;	//weak_ptr的引用計數
};

counter對象的目地就是用來申請一個塊內存來存引用基數,s是share_ptr的引用計數,w是weak_ptr的引用計數,當w為0時,刪除Counter對象。

1.3.2 share_ptr的簡單實現

template <class T>
class WeakPtr; //為了用weak_ptr的lock(),來生成share_ptr用,需要拷貝構造用template <class T>
class SharePtr
{
public:SharePtr(T *p = 0) : _ptr(p){cnt = new Counter();if (p)cnt->s = 1;cout << "in construct " << cnt->s << endl;}~SharePtr(){release();}SharePtr(SharePtr<T> const &s){cout << "in copy con" << endl;_ptr = s._ptr;(s.cnt)->s++;cout << "copy construct" << (s.cnt)->s << endl;cnt = s.cnt;}SharePtr(WeakPtr<T> const &w)//為了用weak_ptr的lock(),來生成share_ptr用,需要拷貝構造用{cout << "in w copy con " << endl;_ptr = w._ptr;(w.cnt)->s++;cout << "copy w  construct" << (w.cnt)->s << endl;cnt = w.cnt;}SharePtr<T> &operator=(SharePtr<T> &s){if (this != &s){release();(s.cnt)->s++;cout << "assign construct " << (s.cnt)->s << endl;cnt = s.cnt;_ptr = s._ptr;}return *this;}T &operator*(){return *_ptr;}T *operator->(){return _ptr;}friend class WeakPtr<T>; //方便weak_ptr與share_ptr設置引用計數和賦值protected:void release(){cnt->s--;cout << "release " << cnt->s << endl;if (cnt->s < 1){delete _ptr;if (cnt->w < 1){delete cnt;cnt = NULL;}}}private:T *_ptr;Counter *cnt;
};

share_ptr的給出的函數接口為:構造,拷貝構造,賦值,解引用,通過release來在引用計數為0的時候刪除_ptr和cnt的內存。

1.3.3 weak_ptr簡單實現

template <class T>
class WeakPtr
{
public: //給出默認構造和拷貝構造,其中拷貝構造不能有從原始指針進行構造WeakPtr(){_ptr = 0;cnt = 0;}WeakPtr(SharePtr<T> &s) : _ptr(s._ptr), cnt(s.cnt){cout << "w con s" << endl;cnt->w++;}WeakPtr(WeakPtr<T> &w) : _ptr(w._ptr), cnt(w.cnt){cnt->w++;}~WeakPtr(){release();}WeakPtr<T> &operator=(WeakPtr<T> &w){if (this != &w){release();cnt = w.cnt;cnt->w++;_ptr = w._ptr;}return *this;}WeakPtr<T> &operator=(SharePtr<T> &s){cout << "w = s" << endl;release();cnt = s.cnt;cnt->w++;_ptr = s._ptr;return *this;}SharePtr<T> lock(){return SharePtr<T>(*this);}bool expired(){if (cnt){if (cnt->s > 0){cout << "empty" << cnt->s << endl;return false;}}return true;}friend class SharePtr<T>; //方便weak_ptr與share_ptr設置引用計數和賦值protected:void release(){if (cnt){cnt->w--;cout << "weakptr release" << cnt->w << endl;if (cnt->w < 1 && cnt->s < 1){//delete cnt;cnt = NULL;}}}private:T *_ptr;Counter *cnt;
};

weak_ptr一般通過share_ptr來構造,通過expired函數檢查原始指針是否為空,lock來轉化為share_ptr。

不過感覺最后的SharePtr有個地方可以改進下: SharePtr在析構時釋放_ptr和cnt,可能會導致釋放cnt不成功。 代碼里cnt的釋放取決于cnt->w, 而cnt->w是否為0取決于WeakPtr的析構。 如果SharePtr先于WeakPtr析構, 此時cnt->w 大于0,SharePtr無法釋放cnt

這個地方感覺可以不用判斷cnt->w,直接delete cnt; cnt->s都為0了,不會有別的地方再使用管理的對象_ptr了,cnt的存在也就沒意義了。

void release()
{cnt->s--;cout << "release " << cnt->s << endl;if (cnt->s < 1){delete _ptr;if (cnt->w < 1)  //取消這個判斷{delete cnt;cnt = NULL;}}
}

1.4 分清楚場合應該使用哪種類型的智能指針;

1.4.1 std::unique_ptr:

1 小巧、高速、具備只移型別的智能指針,對托管資源實施專屬所有權語義。

2 默認地,資源析構采用delete運算符來實現,但可以指定自定義刪除器。有狀態的刪除器和采用函數指針實現的刪除器會增加std::unique_ptr型別的對象尺寸

3 將std::unique_ptr 轉換成std::shared_ptr是容易實現的

1.4.2 std::shared_ptr:

1 提供方便的手段,實現了任意資源在共享所有權語義下進行生命周期管理的垃圾回收

2 與std::unique_*ptr* 相比,std::shared_ptr的尺寸通常是裸指針尺寸的兩倍,它還會帶來控制塊的開銷,并要求原子化的引用計數操作

3 默認的資源析構通過delete運算符進行,但同時也支持定制刪除器。刪除器的型別對std::shared_ptr的型別沒有影響

4 避免使用裸指針型別的變量來創建 std::shared_ptr 指針

1.4.3 std::weak_ptr:

1 使用std::weakptr 來代替可能空懸的std::shared_ptr

2 std::weak_ptr 可能的用武之地包括緩存,觀察者列表,以及避免std::shared_ptr 指針環路。

看看大師的總結,完美!!

具體到完全代替裸指針,恐怕也要再掂量掂量。

下面寫一些劣勢

std::shared_ptr 會增加內存開銷,復制的時候cpu消耗提高【原子count操作】

std::unique_ptr 內存占用小,幾乎可以媲美裸指針;但是它畢竟是一個類,使用的時候,不能復制,導致你一個作用域內只能有一個可用的實例【類似rust的所有權吧,你用起來有點束手束腳】;

std::weak_ptr 必須跟std::shared_ptr配合使用。

優勢:

省去你自己判斷啥時候該釋放資源【異步回調時候智能指針可以完美避免手動控制生命周期;enable_shared_frome_this 已經可以算是一種特別的編程技巧了

裸指針的操作習慣

1.對于性能和內存使用有嚴格要求的場景,不要過于依賴智能指針【比如嵌入式這些的,實際上C+class就夠了】

2.對于類型不敏感的數據【也就是內存了】,可以考慮使用std::array或者std::vector等。因為這個時候,你實際上就是C的操作,類型對于該內存僅僅起到一個布局描述的作用,頻繁的類型轉換【非繼承關系】、字段偏移等操作,用智能指針也沒有什么好處【因為你還是會拿到裸指針去操作】

3.其他的對類型敏感,或者對作用域敏感的數據內存,可以都考慮使用智能指針。局部作用域使用uniqe_ptr , 多作用域的使用shared_ptr,緩存可能失效的情況下使用weak_ptr。

一般應用,除了容器,幾乎一上來全部使用uniqe_ptr,當需要拋出一個副本的時候,使用shared_ptr。當功能完成的時候,哪個內存是全局生命周期,改成裸指針全局裸指針我都不判空】。如果該項目不是那么重要,甚至我都會全部用shared_ptr,不用關心性能問題,因為C++本身的編譯性能已經很高了,隨便寫寫性能就夠了,只要不飛,內存泄漏不是問題。

當我要去判斷某一個內存之后的操作會失效,但是不知道什么時候失效的時候,我使用weak_ptr和shared_ptr。通過weak_ptr接口可以線程安全的獲取我之前的智能指針是否還生效。【這個時候,裸指針,幾乎是沒有辦法的了,很容易出現野指針】

參考: https://blog.csdn.net/Darlingqiang/article/details/114065349?spm=1001.2014.3001.5501

https://zhuanlan.zhihu.com/p/29628938

https://www.zhihu.com/question/319277442/answer/1517987598

https://www.zhihu.com/question/319277442/answer/1517987598

https://blog.csdn.net/H_Strong/article/details/88754979?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161544736616780274137097%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161544736616780274137097&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-88754979.first_rank_v2_pc_rank_v29_10&utm_term=%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88

總結

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

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

日韩不卡高清视频 | 亚洲mv大片欧洲mv大片免费 | 91看片淫黄大片一级在线观看 | 久久久一本精品99久久精品66 | 亚洲免费公开视频 | 国产打女人屁股调教97 | 日韩免费播放 | 91最新在线 | 婷婷久久网站 | 日韩一区二区免费在线观看 | 97国产小视频| 99热国内精品 | 9999精品视频 | 久久精品国产亚洲aⅴ | 久久人人插| av理论电影 | 国产高清日韩欧美 | 日日爱av| 黄色日本片| 伊人黄色网 | 青青草华人在线视频 | 中文字幕日韩精品有码视频 | 狠色狠色综合久久 | 麻豆91视频| www.夜夜骑.com | 一区二区视频在线看 | 亚洲成aⅴ人在线观看 | 色成人亚洲 | 久草资源在线观看 | 国产在线国产 | 久久久久免费精品视频 | 欧美一区二区在线看 | 日韩丝袜 | 国产黄大片在线观看 | 久要激情网 | 天天干天天天天 | 婷婷综合导航 | 91资源在线 | 色婷婷99 | 在线国产91 | 久久综合九色综合欧美狠狠 | 久人人 | 最近的中文字幕大全免费版 | 日本bbbb摸bbbb | 国产成人免费高清 | 黄网站色视频免费观看 | 欧美性色黄 | 日韩一二三区不卡 | 亚洲精品日韩av | 九九热在线免费观看 | 久久久久久久久久久久国产精品 | 波多野结衣一区二区三区中文字幕 | 亚洲成人第一区 | 欧美日韩免费在线观看视频 | 亚洲一区二区视频 | 国产精品久久久久久久av大片 | 9999在线观看 | 成人黄色av免费在线观看 | 日韩av免费在线看 | 久久久久麻豆v国产 | 日本二区三区在线 | 国产69精品久久久久9999apgf | 中文不卡视频在线 | 一级性视频 | 久久1区 | 777奇米四色| 色婷婷综合五月 | 日韩欧美在线观看一区 | 欧美做受高潮1 | 国产精品一区二区中文字幕 | 99热9| 亚洲午夜久久久综合37日本 | 亚洲成人频道 | 国产中文字幕一区二区 | 日本不卡一区二区三区在线观看 | 999成人免费视频 | 日韩欧美国产成人 | 最近中文字幕mv免费高清在线 | 欧美亚洲成人免费 | 99国产成+人+综合+亚洲 欧美 | 精品在线观看一区二区 | 日本精品在线视频 | 欧美成人免费在线 | 97小视频 | 色先锋av资源中文字幕 | 亚洲污视频 | 天天超碰 | 六月丁香久久 | 狠狠干.com| 91福利在线导航 | 91九色porny在线 | 天天摸夜夜添 | 国产福利在线不卡 | 永久免费视频国产 | 亚洲精品小区久久久久久 | 国产成人久久av | 国产精品毛片一区二区 | 天天干夜夜夜操天 | 综合网在线视频 | 日韩在线三区 | 国产又粗又硬又长又爽的视频 | 黄色三级av | 亚州精品一二三区 | 97理论电影 | 成人免费影院 | 日韩中文字幕a | 久久久久久美女 | 九九久久在线看 | 亚洲蜜桃av| 日韩在线观看中文 | 久久国产麻豆 | 久久视频一区 | 精品久久久久久国产 | 日韩免费电影网 | 亚洲全部视频 | 久久人人添人人爽添人人88v | 伊人久久av | 国产成人一区三区 | 精品女同一区二区三区在线观看 | 超碰97中文 | 国产综合精品久久 | 免费黄色激情视频 | 96精品在线 | 亚洲春色综合另类校园电影 | 一级免费黄视频 | 高清精品视频 | 亚洲欧美视频 | av经典在线| 成年人国产精品 | 激情婷婷六月 | 久久在线看 | 人人澡超碰碰97碰碰碰软件 | 色播99| 高清在线观看av | 国产精品视频久久久 | 六月丁香婷婷久久 | 91精品播放 | 国产精品成久久久久 | 麻花传媒mv免费观看 | 在线最新av| 国产精品毛片完整版 | 日韩精品综合在线 | 特级a老妇做爰全过程 | 九九热re | 色综合天天干 | 亚洲日日夜夜 | 草久久精品 | 国产精品美女视频 | 88av视频| av久久在线 | 久久av影视 | 尤物九九久久国产精品的分类 | 麻豆91精品 | 黄色软件在线观看免费 | 国产一区在线观看免费 | 91私密保健 | 亚洲小视频在线 | 日韩免费在线视频观看 | 69视频永久免费观看 | 国产精品自拍在线 | 亚洲一区二区精品在线 | 精品国产一区在线观看 | 国产高清视频网 | 去看片| 免费观看国产视频 | 欧美一级电影 | 中文字幕成人网 | 国产五月天婷婷 | 99热九九这里只有精品10 | 超碰在线中文字幕 | 超碰在线人 | 成人av观看 | 欧美日韩激情视频8区 | 久草在线视频精品 | 亚洲毛片一区二区三区 | 91视频电影 | 中文字幕免费在线 | 国产精品日韩久久久久 | 日本韩国精品在线 | 四虎成人精品在永久免费 | 欧美精品在线观看 | 日韩黄色中文字幕 | 国产精品免费视频网站 | 欧美在线91 | 国产亚洲精品精品精品 | 有码中文在线 | 国产高清99 | 91最新国产 | 亚洲精品日韩一区二区电影 | 国产青春久久久国产毛片 | 欧美国产不卡 | 中文字幕在线视频一区二区 | 天堂在线免费视频 | 在线观看国产亚洲 | 日韩肉感妇bbwbbwbbw | 国色天香在线 | 国产精品一区二区在线观看 | 亚洲精品字幕在线观看 | 色狠狠综合 | 最近最新最好看中文视频 | 欧美日韩a视频 | 日韩激情精品 | а天堂中文最新一区二区三区 | 午夜视频亚洲 | 免费成人在线观看 | 日韩在线观看网址 | 黄色资源在线 | 色综合久久88色综合天天免费 | 国产香蕉久久精品综合网 | 欧美精品首页 | www.777奇米| 亚洲成年片 | 日本中文字幕系列 | 国产视频精品免费 | 国产一二三四在线观看视频 | 成人av在线观 | 国产精品大片在线观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 日韩在线欧美在线 | 久久都是精品 | 91视频久久久久久 | 天天插天天色 | 亚洲女裸体 | 久久久毛片 | 九九在线视频免费观看 | 天天爽夜夜爽人人爽曰av | 手机av网站| 干狠狠| 91欧美日韩国产 | 欧美国产日韩一区二区 | 天天干,天天射,天天操,天天摸 | 久久伊人精品一区二区三区 | 欧美一级网站 | 欧美一区二区三区四区夜夜大片 | 免费看一级黄色大全 | 欧美色888 | 国产精品视频在线观看 | 国产精品久久久久免费 | 丰满少妇在线观看网站 | 久久久免费播放 | www五月婷婷 | 精品久久久久久亚洲综合网站 | 久久9999久久免费精品国产 | 麻豆一区二区三区视频 | 欧美日韩一级久久久久久免费看 | 99激情网 | 中文字幕在线看视频 | se婷婷 | 特级西西www44高清大胆图片 | 91视频在线播放视频 | 免费一级日韩欧美性大片 | 日韩精品在线观看视频 | 日一日干一干 | 中文字幕中文字幕在线中文字幕三区 | 一本色道久久综合亚洲二区三区 | 色偷偷88欧美精品久久久 | 国产精品美女久久久久久网站 | 人人看人人艹 | 久久精品视频日本 | 97电影院在线观看 | 日韩av高清在线观看 | 中文字幕国语官网在线视频 | 韩日三级av| 成人视屏免费看 | 国产综合片 | 视频在线观看一区 | 国产黄色精品在线观看 | 国产国产人免费人成免费视频 | 久草视频在线免费 | 国产91在线 | 美洲 | 日韩二区三区在线 | 国产精品毛片久久久久久久 | 久久久久麻豆v国产 | 在线视频一区二区 | 深夜免费小视频 | 亚洲一级黄色av | 99久久国产免费,99久久国产免费大片 | 在线观看成人小视频 | 成人免费观看网址 | 成人资源站 | 久久久久久久久久久网 | 91视频一8mav| 亚洲日本国产精品 | 日日日操操 | 久久草在线视频国产 | www激情网| 亚洲不卡在线 | 黄色不卡av| 国产亚洲精品电影 | 欧美成人日韩 | 国产精品igao视频网网址 | 五月亚洲| 狠狠色伊人亚洲综合网站野外 | 亚洲一级片av | 天天草av | 国产xxxx | 久久这里精品视频 | 91网站在线视频 | 亚洲精品小视频在线观看 | 天天伊人网 | 天天透天天插 | 91精品免费在线观看 | 国产99自拍 | 国产精品一区二区三区免费视频 | 久久黄页 | 国产无套一区二区三区久久 | 亚洲精品美女在线观看 | 久久成人午夜 | 黄色1级大片 | a视频免费 | 九九久久久久久久久激情 | 日本黄色a级大片 | 日日爽天天操 | 欧美大香线蕉线伊人久久 | 日日夜操 | 超碰com| 中文字幕综合在线 | 日韩精品无码一区二区三区 | 在线观看国产一区二区 | 国产一区二区久久久 | 91在线精品秘密一区二区 | 激情五月综合网 | www.888.av| 最近中文字幕久久 | 国产精品永久在线观看 | 91精品视频一区二区三区 | 久久资源总站 | 成人av电影免费在线观看 | 久久国产免费 | 久草电影免费在线观看 | 久久欧美在线电影 | 日韩av网址在线 | 夜夜干夜夜 | 日日操日日 | 女人18精品一区二区三区 | av色影院 | 激情丁香5月 | 国产精品视频线看 | 激情小说 五月 | av观看网站 | 91爱爱中文字幕 | 黄色影院在线免费观看 | 日日干,天天干 | 成人精品影视 | 国产视频2 | 天天爱av导航 | 激情伊人 | 五月天开心 | 亚洲黄色一级电影 | 日日爱影视 | 日本久久片 | 亚洲人成精品久久久久 | 国产精品国产自产拍高清av | 天天拍天天干 | 欧美国产日韩一区二区 | av高清一区二区三区 | 欧美性超爽 | 91av久久| 99视频在线精品 | 欧美性生活大片 | 99国产精品一区 | 亚洲成人软件 | 国产私拍在线 | 五月天.com | 欧美色黄 | 免费看片网页 | 99国产精品久久久久老师 | 美女黄网站视频免费 | av不卡中文 | 天天操天天怕 | 亚洲免费一级 | 久久久久久久久久久久影院 | 国产精品免费av | 尤物九九久久国产精品的分类 | 91av视频在线观看免费 | 国产专区一 | 色婷婷成人网 | www.狠狠色| 一本到视频在线观看 | 九九热视频在线 | 日韩精品视频免费专区在线播放 | 国产在线观看99 | 综合精品在线 | 日韩有码在线播放 | 国产不卡av在线 | 免费又黄又爽 | 国产在线色视频 | 日韩欧美在线一区二区 | 亚洲精区二区三区四区麻豆 | 中文字幕国产 | 99热国产精品 | 五月天激情视频在线观看 | 国产精品99久久久精品 | 麻豆视频大全 | 99视频在线观看视频 | 久草在线播放视频 | 天天爽夜夜爽人人爽一区二区 | 免费能看的av | www日韩在线观看 | 在线看片日韩 | 超碰免费av | 91精品视频免费看 | 亚洲欧美日韩一二三区 | 在线91色 | 日韩精品久久久久久久电影竹菊 | 亚洲 在线 | 中文永久字幕 | 久久国产麻豆 | 日本三级国产 | 91av在线免费观看 | 玖玖在线观看视频 | 国产成人精品一区二 | 免费看高清毛片 | 中文在线免费视频 | 免费av在线网 | 国产精品久久久久久久久久久免费看 | www.夜夜爱 | 一区二三国产 | 免费视频xnxx com | 日韩黄视频| 一区二区三区 中文字幕 | 免费a视频在线观看 | 免费高清在线视频一区· | 国产美女视频 | 伊人影院99 | 国产一二区视频 | 成年人电影免费看 | 久久综合加勒比 | 视频一区视频二区在线观看 | 日韩欧美精选 | 99久久久| 成人av影视观看 | 国产一区二区三区免费在线 | 免费黄色网址大全 | 精品99免费视频 | 亚洲综合日韩在线 | 97人人爽人人 | www.色com| 国产精品亚洲成人 | 最新超碰| a黄色片| 91香蕉视频黄色 | 亚洲成av人影院 | 国产成人精品999在线观看 | 欧美日韩裸体免费视频 | 日韩免费一区二区在线观看 | 国产精品自在线拍国产 | 国产高清不卡 | 狠狠色丁香 | 国产综合精品一区二区三区 | 色在线高清 | 欧美精品乱码久久久久久按摩 | 一级片视频免费观看 | 欧美电影在线观看 | 久草在线中文888 | 黄色录像av| 天天艹天天操 | 91麻豆精品国产91久久久久久久久 | 国产精品久久久久婷婷 | 91在线区| 91精品久久久久 | 天天骚夜夜操 | 久久综合亚洲鲁鲁五月久久 | 日韩在线第一 | 日韩免费电影网 | 中文字幕 国产专区 | 丰满少妇在线观看网站 | 国产精品久久久久久久免费大片 | 国产精品久久亚洲 | 免费影视大全推荐 | av在线播放中文字幕 | av在线电影免费观看 | 婷婷色综合色 | 久久少妇| 国产精品每日更新 | 日韩av成人 | av成人在线观看 | 亚洲一区网站 | 四虎影院在线观看av | 人人爱在线视频 | 国产精品一区二区中文字幕 | 日本狠狠色| 欧美淫视频| 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲在线色 | 久久精品牌麻豆国产大山 | 在线免费观看av网站 | 九色精品免费永久在线 | 99se视频在线观看 | 91精品久久久久久粉嫩 | 国产视频二区三区 | 视频福利在线观看 | 亚洲精品视频免费在线 | 国产精品久久久777 成人手机在线视频 | 99精品视频在线免费观看 | 看毛片网站| 丁香在线观看完整电影视频 | 亚洲欧洲视频 | 午夜精品久久久99热福利 | 久久精品99久久 | 狠狠色丁香久久婷婷综合_中 | 日日夜夜天天射 | 不卡的一区二区三区 | 免费看国产a | 欧日韩在线 | 免费视频成人 | 国产免费叼嘿网站免费 | 久久精品久久久久久久 | 一二三区高清 | 在线 影视 一区 | 欧美一级视频在线观看 | 99视| 久久公开视频 | 片网址| 99r在线观看 | 日韩电影中文 | 久久久精品高清 | 欧美一区二区三区在线视频观看 | 久久久久久久久久久精 | 国产一区二区三区在线 | 2019精品手机国产品在线 | 欧美福利在线播放 | 天堂网一区二区 | 国产黄在线 | 99r精品视频在线观看 | 国产五月色婷婷六月丁香视频 | 99久久99热这里只有精品 | 日韩欧美视频一区二区三区 | 国产一区高清在线观看 | 成 人 黄 色 免费播放 | 性色在线视频 | 久久免费精彩视频 | 成人av.com| 99久久精品免费看国产麻豆 | 中文字幕在线观看2018 | 日本成人中文字幕在线观看 | 中文字幕av免费在线观看 | 天天射天天色天天干 | 国产电影黄色av | 天天色天天色 | 日韩中文字 | 99精品在线免费观看 | 亚洲综合色视频在线观看 | 波多野结衣亚洲一区二区 | 在线看日韩av | 三级黄色大片在线观看 | 久久久久久久久久影视 | 狠狠躁夜夜躁人人爽超碰91 | 久久er99热精品一区二区三区 | 久草精品视频在线看网站免费 | 在线观看成人一级片 | 日批视频在线观看免费 | 超碰在线官网 | 天天在线操 | 国产精品久久久久久久久久久久午夜 | 狠狠gao| 九色精品免费永久在线 | 亚洲国产综合在线 | 激情视频在线观看网址 | 五月在线视频 | 久久久久夜色 | 久久精品爱爱视频 | 色老板在线 | 日韩在线视频二区 | 成人av在线资源 | 在线观看精品黄av片免费 | 91豆花在线| 天天操欧美| 91日韩在线专区 | 国产精品igao视频网网址 | 国产九九九视频 | 日韩网 | 成人免费看电影 | 1区2区3区在线观看 三级动图 | 国内免费久久久久久久久久久 | 日韩影视在线观看 | av中文字幕在线看 | 婷婷色在线播放 | 97操操操 | 日本黄色大片免费看 | 91av九色| 四虎5151久久欧美毛片 | www.在线观看av| 国产精品成人a免费观看 | 国产一区免费在线 | 国产伦精品一区二区三区在线 | 国产午夜精品一区二区三区欧美 | 99热播精品 | 久久久久久国产精品免费 | 最近中文字幕mv免费高清在线 | 91av手机在线| 中文十次啦 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 天天干天天弄 | 中文字幕色站 | 亚洲三级网 | 一区二区激情视频 | 国产精品v欧美精品v日韩 | 亚洲欧洲成人精品av97 | 欧美日韩一区二区免费在线观看 | 免费国产在线视频 | 97人人澡人人添人人爽超碰 | 狠狠操狠狠| 国产成人在线免费观看 | 久久91久久久久麻豆精品 | 五月天激情在线 | 国内精品久久久久久久影视简单 | av在线播放不卡 | 天天干,天天射,天天操,天天摸 | 性色xxxxhd| 国产在线精品一区二区三区 | 免费能看的黄色片 | 丁香六月婷婷开心 | 丁香激情综合久久伊人久久 | 国产精品观看 | 亚洲视频1区2区 | 国产91精品一区二区 | 国产成人精品久久 | 成人性生交大片免费看中文网站 | 久久久99精品免费观看 | 在线中文日韩 | 又色又爽又激情的59视频 | 久久久美女 | 在线免费观看一区二区三区 | 日韩欧美在线观看一区 | 精选久久 | 激情视频免费在线观看 | 五月天色综合 | 日韩免费在线观看网站 | www.黄色小说.com | 在线观看成人小视频 | 久久,天天综合 | 国产精品一区专区欧美日韩 | 精品视频123区在线观看 | 综合色在线观看 | 日韩欧在线 | 在线看的av网站 | 久久久久久久久久久久久影院 | 五月婷丁香 | 最近中文字幕免费视频 | 日韩欧美综合在线视频 | 日韩三级一区 | 国内丰满少妇猛烈精品播放 | 日本女人在线观看 | 狠狠躁日日躁夜夜躁av | 国产在线观看午夜 | 99热最新在线 | 二区中文字幕 | 91成年人在线观看 | 免费日韩一区二区三区 | 日韩精品一区二区三区免费观看视频 | 精品视频9999 | 国产中文字幕久久 | 色99之美女主播在线视频 | 久久在线播放 | 国产高清在线观看av | 国产午夜精品一区二区三区在线观看 | 天天色宗合 | 精品视频中文字幕 | 国产中文字幕视频在线 | 精品久久视频 | 97超碰.com | 4438全国亚洲精品在线观看视频 | 国产黄色高清 | 国产精品免费av | 国产亚洲精品美女久久 | 国产在线一线 | 国产网站av | 波多野结衣视频网址 | 亚洲午夜av久久乱码 | 99热在线看 | 国产乱老熟视频网88av | 国产成免费视频 | 香蕉视频久久久 | 天天干 夜夜操 | 久久精品视频在线看 | 九九久久婷婷 | 免费在线日韩 | 国产精品久久久久久久久久久免费看 | 午夜影院一级 | 五月婷网 | www.天天草 | 在线v | 欧美在线99 | 黄色大片日本 | 色午夜| 国产亚洲va综合人人澡精品 | 国产一区二区三区免费观看视频 | 成人黄色电影在线 | 欧美成人按摩 | 成人黄色国产 | 久久综合狠狠 | 欧美国产精品久久久久久免费 | 91精品国产综合久久福利 | 亚洲激情小视频 | 免费看色的网站 | 在线视频精品播放 | 精品久久一级片 | 黄污网站在线 | 欧美九九九 | 久久久.com| 欧美福利片在线观看 | 久久五月情影视 | 免费在线一区二区 | 国产视频一区二区三区在线 | 一级黄毛片 | 国产一卡二卡在线 | 欧美一级片在线观看视频 | 久久99国产综合精品 | 欧美精品一级视频 | 久久一区二区三区超碰国产精品 | 又粗又长又大又爽又黄少妇毛片 | 中文字幕传媒 | 免费高清av在线看 | 天天操夜夜操天天射 | 一区二区三区四区在线免费观看 | 亚洲精品色 | 日韩色在线| 日韩在线观看视频免费 | 色吊丝在线永久观看最新版本 | 97在线观看免费观看 | 最近中文字幕大全中文字幕免费 | 色香蕉在线视频 | 成全免费观看视频 | 国产精品自产拍在线观看桃花 | 国产免费黄视频在线观看 | 久久精品久久精品久久精品 | 国产精品大全 | 免费成人黄色av | 婷婷日| 久久经典视频 | a在线观看免费视频 | www.夜夜操.com | 亚州中文av | 国产在线探花 | 麻豆成人精品视频 | 国产免费激情久久 | www国产亚洲精品久久麻豆 | 黄毛片在线观看 | 天天操天天干天天玩 | 综合色站导航 | 97成人在线免费视频 | 欧美性春潮 | 日韩在线观看a | 五月婷婷影院 | 好看的国产精品视频 | 美女黄濒 | 麻豆免费视频网站 | 午夜视频播放 | 91精品啪 | 91免费高清 | 免费人人干 | 国产小视频在线 | 色婷婷福利 | 天天色天天综合 | 在线日韩三级 | 亚洲综合色婷婷 | 国产成人精品亚洲精品 | 欧美va电影 | 五月黄色 | 黄色1级大片 | 国产精品久久久一区二区三区网站 | 日本黄色片一区二区 | 亚洲在线a| 日本黄色免费播放 | 免费高清在线观看电视网站 | 国产免费不卡 | 三级在线国产 | 亚洲成人av在线播放 | 一区二区三区中文字幕在线观看 | 日韩高清免费无专码区 | 久草视频网| 97影视 | 黄色一级大片在线免费看国产一 | 日韩欧美视频一区二区三区 | 国产精品av免费在线观看 | 日日夜夜人人精品 | 欧美日韩激情视频8区 | 国产在线 一区二区三区 | 麻豆视屏 | 久久久久久99精品 | 欧美日韩在线看 | 2021国产视频 | 西西444www | 久久精品直播 | 99视频播放 | 精品国产亚洲日本 | 女人18毛片a级毛片一区二区 | 福利电影一区二区 | 99在线视频观看 | 99热在线免费观看 | 天堂麻豆| 日本论理电影 | 激情在线免费视频 | 91成人免费电影 | 97在线精品视频 | 国产午夜精品一区二区三区欧美 | 五月天综合色 | 97色综合 | 狠狠黄 | 黄www在线观看 | 国产福利精品视频 | 国产高清一级 | 国产三级精品在线 | 99精品视频中文字幕 | 国产中文欧美日韩在线 | 99精品久久久久久久 | 色婷婷播放 | 国产精品久久久久久久久久妇女 | 国产一级免费片 | 欧美 日韩 成人 | 在线探花| 99精品免费久久久久久日本 | 综合久久久 | 麻豆视频在线免费看 | 国产福利91精品一区 | 亚洲美女免费精品视频在线观看 | 成人国产精品 | 国产玖玖精品视频 | 免费激情网| 国产成人黄色片 | 亚洲第一区精品 | 国产日韩欧美中文 | 亚洲欧洲精品一区二区精品久久久 | 777久久久 | 午夜色大片在线观看 | 国产成人一区二区三区电影 | 97精品一区二区三区 | 91大神精品视频在线观看 | 亚洲一级电影视频 | 国产a精品 | 97精品视频在线播放 | 午夜视频在线观看一区 | 久久久久久网址 | 五月天最新网址 | 色五月色开心色婷婷色丁香 | 成人黄色电影在线 | 中文字幕在线不卡国产视频 | 亚洲小视频在线观看 | 天天夜操 | 色婷婷视频 | japanesexxxhd奶水| 欧美做受69 | 97超碰资源网 | 婷婷六月天在线 | 国产中文伊人 | 激情综合五月天 | 日韩一区二区久久 | 国产精品1区2区3区在线观看 | av久久在线| 久久不射电影院 | 色婷婷视频在线观看 | 日日夜夜天天 | 日韩av不卡在线 | 婷婷九月丁香 | 全久久久久久久久久久电影 | 欧美精品视 | 精品国产乱码久久久久久天美 | 性色av免费在线观看 | 香蕉视频久久 | 91九色网站 | 国产精品久久网站 | 国产日产亚洲精华av | 亚洲国产欧美一区二区三区丁香婷 | 国产一区高清在线 | 操操操影院 | 日韩理论电影网 | 在线观看你懂的网站 | 三级黄免费看 | 黄色天堂在线观看 | 91精品在线免费观看 | 日韩免费看视频 | 91高清视频在线 | 亚洲福利精品 | 欧美精品亚洲精品 | 天堂在线视频中文网 | 精品国产成人在线影院 | 亚洲欧洲精品在线 | 日韩电影中文字幕在线 | 五月天天天操 | 精品人妖videos欧美人妖 | 久久美女精品 | a黄色大片 | 丁香婷婷成人 | 亚洲电影一区二区 | 久久 精品一区 | 天天操天天吃 | 最新国产精品视频 | 黄色的网站免费看 | 久久精品2 | 国产成人av一区二区三区在线观看 | 九九热免费精品视频 | 久久免费视频这里只有精品 | 国产成人精品女人久久久 | 午夜精品久久久99热福利 | 国产成人在线网站 | 久久久天堂 | 精品一区二区三区香蕉蜜桃 | 国产aaa大片 | 国产美女免费观看 | 亚洲久草视频 | 久久人人爽 | 亚洲精品综合一区二区 | 久碰视频在线观看 | 九九精品久久 | 青青河边草免费直播 | 日韩av电影中文字幕 | 亚洲va在线va天堂va偷拍 | 色妞色视频一区二区三区四区 | 在线视频中文字幕一区 | 91视频麻豆视频 | 国产一区二区在线视频观看 | 欧美韩日在线 | 日韩精品一区二区三区高清免费 | 18女毛片 | wwwwwww色 | 日韩理论视频 | 日本久久久久久久久 | 一区二区三区四区在线免费观看 | 国产二级视频 | 97在线看片 | 日韩精品一区二区三区中文字幕 | 久久精品亚洲综合专区 | 在线观看小视频 | 美女视频是黄的免费观看 | 日韩在线激情 | 日韩av有码在线 | 国产色视频一区二区三区qq号 | 香蕉影视在线观看 | 九色免费视频 | 日韩av在线免费播放 | 探花视频免费在线观看 | 伊人伊成久久人综合网小说 | 久久久久亚洲精品中文字幕 | 97av影院 | 最近中文字幕高清字幕免费mv | 四虎最新域名 | 日韩av网页 | 成人黄色小说在线观看 | 97超碰成人 | 伊人黄色网 | 日韩福利在线观看 | 免费视频 你懂的 | 91插插插网站 | 蜜臀久久99精品久久久酒店新书 | 一区二区毛片 | 国产精品久久久久久久久久新婚 | 日韩成人xxxx | 日本最新一区二区三区 | 日韩欧美网址 | 91久久精品一区二区二区 | 日韩中文字幕视频在线 | 国产精品免费一区二区三区在线观看 | 国产美女搞久久 | 久久久久国产免费免费 | 91色吧| 91亚洲精品国偷拍 | 亚洲精品婷婷 | 欧美aa级 | 国产精品第一视频 | 日日干日日操 | 免费观看第二部31集 | 久久国语露脸国产精品电影 | 久久免费毛片 | 国产一级高清视频 | 精品久久久久久久久亚洲 | 亚洲九九影院 | 成人av片在线观看 | 一区二区精品久久 | 久久久久五月 | 五月婷视频 | 精品久久久久久久久久岛国gif | 午夜精品久久久久 | 国产美女网站在线观看 | 国产精品高清一区二区三区 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 99精品国自产在线 | 黄色免费网 | 久久婷婷网 | 久久免费观看少妇a级毛片 久久久久成人免费 | 国产精品自产拍在线观看 | 久久久久女人精品毛片九一 | av片子在线观看 | 青青久草在线 | 日韩视频一区二区三区在线播放免费观看 | av日韩国产 | 最新色视频 | 色99之美女主播在线视频 | 美女视频永久黄网站免费观看国产 | 国产精品自产拍在线观看蜜 | 日日干网| 日韩av影片在线观看 | 91成人区 | 欧美亚洲另类在线视频 | 999色视频| 婷婷综合五月 | 久久久国产毛片 | 久久久精品久久 |