久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

C++智能指針深度解析:unique_ptr、shared_ptr與weak_ptr避坑指南

C++智能指針深度解析:unique_ptr、shared_ptr與weak_ptr避坑指南 做C開發(fā)這些年內(nèi)存管理一直是繞不開的話題。很多人剛接觸智能指針的時候覺得它不過是用起來方便但真到了排查線上內(nèi)存泄漏、設(shè)計復(fù)雜對象生命周期時只停留在會用層面遠(yuǎn)遠(yuǎn)不夠。這篇筆記是我自己反復(fù)踩坑之后的整理圍繞C里三個核心智能指針——unique_ptr、shared_ptr、weak_ptr把怎么用、為什么這么用、底層原理是什么、多線程下有哪些坑一次性說透。這篇文章適合兩類人一類是剛學(xué)完C基礎(chǔ)、開始接觸現(xiàn)代C的初學(xué)者另一類是已經(jīng)在項目里用智能指針但遇到問題找不到根因的進(jìn)階開發(fā)者。我不打算堆概念而是直接從實際代碼場景切入把RAII思想、引用計數(shù)機(jī)制、循環(huán)引用陷阱這些內(nèi)容串起來幫你看清智能指針的全貌。1. 從裸指針到RAII為什么需要智能指針1.1 裸指針的幾大痛點手動管理內(nèi)存這件事本質(zhì)上是在跟人的記憶力做對抗。你new了一個對象就得記著在哪里delete如果中間某個分支提前return了delete就可能被跳過如果同一塊內(nèi)存被兩個指針同時持有釋放順序錯了就會崩潰。我早年寫業(yè)務(wù)代碼時最常見的就是函數(shù)體里new了一個臨時對象做著做著某個條件不滿足直接return結(jié)果delete那句話永遠(yuǎn)沒機(jī)會執(zhí)行。內(nèi)存泄漏不會立刻讓你崩潰但日積月累進(jìn)程內(nèi)存持續(xù)上漲到最后只能重啟服務(wù)來續(xù)命。除了忘記釋放還有重復(fù)釋放。兩個指針指向同一塊堆內(nèi)存前面先delete了一次后面又delete一次這是典型的未定義行為——運(yùn)氣好只是報錯運(yùn)氣差直接拖垮整個進(jìn)程。更隱蔽的是懸空指針delete之后指針本身還保留著原來的地址值但你不可能保證這塊內(nèi)存沒有被別人重新使用。只要邏輯再從這里讀一次數(shù)據(jù)拿到的就是臟數(shù)據(jù)排查起來異常痛苦。再看看異常安全。C的異常機(jī)制讓控制流變得不那么直白如果在new之后、delete之前拋出了異常棧就開始回退delete代碼根本執(zhí)行不到。手動處理需要層層try/catch代碼丑到?jīng)]眼看還不一定能覆蓋全部分支。裸指針的問題不是程序員不夠小心而是這個方案本身就逼著你在每個可能的失控點上做防御總會有漏網(wǎng)之魚。1.2 RAII思想用對象生命周期綁定資源生命周期現(xiàn)代化C解決內(nèi)存管理問題靠的不是繼續(xù)加強(qiáng)小心程度而是改變資源的歸屬方式。核心思想就是RAIIResource Acquisition Is Initialization通常翻譯成資源獲取即初始化。聽起來很學(xué)術(shù)實際上非常簡單把資源放進(jìn)一個對象的內(nèi)部讓這個對象的構(gòu)造函數(shù)負(fù)責(zé)獲取資源析構(gòu)函數(shù)負(fù)責(zé)釋放資源。對象是棧上的只要它的作用域結(jié)束編譯器就一定調(diào)用析構(gòu)函數(shù)不管你是正常走完還是因為異?;赝说?。拿內(nèi)存舉例你不需要手動delete只需要讓一個智能指針對象持有那塊內(nèi)存的地址。智能指針自己會實現(xiàn)析構(gòu)函數(shù)在析構(gòu)函數(shù)里調(diào)用delete。于是內(nèi)存的釋放就綁定了智能指針對象的生命周期而智能指針本身是棧對象作用域一結(jié)束自動析構(gòu)內(nèi)存自然就釋放了。這個思路徹底繞開了記得delete的問題因為釋放邏輯是編譯器幫你保證執(zhí)行的。這也是為什么現(xiàn)代C項目里裸指針被限制在很小的范圍內(nèi)。RAII不僅適用于內(nèi)存還適用于文件句柄、互斥鎖、數(shù)據(jù)庫連接等所有需要配對獲取/釋放的資源。理解了這個底層邏輯后面看unique_ptr、shared_ptr這些具體實現(xiàn)就會覺得一切都是順理成章的事。它們本質(zhì)上都是資源管理對象只是對資源的所有權(quán)模型設(shè)計得不同從而適配不同的使用場景。2. 三種智能指針的核心原理與適用場景2.1 unique_ptr獨占所有權(quán)std::unique_ptr是所有智能指針里最輕量、也最符合直覺的一個。它的名字就說明了它的性格獨占所有權(quán)。一個資源在同一時刻只能被一個unique_ptr持有不允許拷貝只能通過移動來轉(zhuǎn)移所有權(quán)。從原理上看它內(nèi)部就是保存了一個裸指針析構(gòu)時釋放拷貝構(gòu)造和拷貝賦值都被刪除了只有移動構(gòu)造和移動賦值被保留下來。正是因為獨占所以它沒有任何額外的計數(shù)開銷幾乎和裸指針一樣快。你看它的典型用法從工廠函數(shù)返回新對象或者作為局部變量管理某個生命周期單一的資源。比如你寫了一個創(chuàng)建配置對象的函數(shù)#include memory struct Config { int timeout 30; }; std::unique_ptrConfig makeConfig() { return std::make_uniqueConfig(); } void demo() { auto cfg makeConfig(); // 局部變量退出作用域自動釋放 // 這里絕對不能 copy但可以 move auto cfg2 std::move(cfg); // cfg 變成空所有權(quán)轉(zhuǎn)移給 cfg2 if (!cfg) { // 轉(zhuǎn)移后原來的cfg為空可以用來做判空 } }很多人會困惑什么時候用unique_ptr什么時候應(yīng)該用shared_ptr我的經(jīng)驗是如果資源的所有權(quán)從一開始就是清晰的、唯一的優(yōu)先用unique_ptr。它約束了代碼防止別人隨意拷貝等于把所有權(quán)語義寫進(jìn)了類型系統(tǒng)里。就算以后真的需要共享也可以把它移動進(jìn)shared_ptr這個升級成本很低。unique_ptr的另一個特性是刪除器可以作為模板參數(shù)的一部分。這意味著如果資源的釋放方式不是普通delete你可以在類型層面指定如何釋放比如處理文件指針FILE*時用fclose。因為刪除器是類型的一部分每個不同刪除器的unique_ptr是不同的類型這是它和后面的shared_ptr的一個關(guān)鍵差異。2.2 shared_ptr引用計數(shù)實現(xiàn)共享std::shared_ptr解決的是一塊內(nèi)存可能有多個持有者的問題。它內(nèi)部維護(hù)一個引用計數(shù)每個持有者都讓計數(shù)加一當(dāng)最后一個持有者被銷毀或者重置時計數(shù)降到零就會真正釋放內(nèi)存。你可以把它理解成一個共享租約只要還有一個人在使用房子就不會被拆掉當(dāng)最后一個房客搬走才進(jìn)入拆除流程。引用計數(shù)在原理上不難但實現(xiàn)細(xì)節(jié)里有不少講究。每個shared_ptr對象內(nèi)部不只保存裸指針還會保存一個指向控制塊的指針控制塊里放著強(qiáng)引用計數(shù)、弱引用計數(shù)、刪除器、分配器等信息。當(dāng)你拷貝一個shared_ptr時兩個shared_ptr指向同一個控制塊計數(shù)加一。當(dāng)一個shared_ptr銷毀時計數(shù)減一減到零就釋放資源、銷毀控制塊。這個過程是自動的你不需要關(guān)心具體時機(jī)只需要保證一個資源從創(chuàng)建開始就統(tǒng)一交給shared_ptr管理。實際開發(fā)中shared_ptr最常見的坑出在初始化方式上。如果你用同一個裸指針去創(chuàng)建兩個獨立的shared_ptr等于生成了兩個互不相干的控制塊最后每個控制塊都會嘗試釋放同一塊內(nèi)存導(dǎo)致雙重釋放崩潰。正確做法是直接使用std::make_shared或者從一個已有的shared_ptr拷貝。這不僅僅是代碼風(fēng)格問題而是關(guān)系到底層控制塊是否唯一的問題后面我會專門展開。shared_ptr還有一個容易被忽略的特性它會把刪除器保存在控制塊里。所以即使兩個shared_ptr的類型不同比如刪除器不同只要它們控制著同一個對象仍然可以賦值和拷貝因為刪除器是運(yùn)行時信息。這一點和unique_ptr截然不同。2.3 weak_ptr用來打破循環(huán)引用的觀察者std::weak_ptr不是獨立的資源管理工具它是shared_ptr的觀察者。它指向一個由shared_ptr管理的對象但不會增加強(qiáng)引用計數(shù)。這意味著它不擁有資源也不阻止資源被釋放。當(dāng)你需要訪問對象時要調(diào)用lock()來臨時獲得一個shared_ptr如果對象已經(jīng)被釋放lock()會返回一個空的shared_ptr。這里有一個非常重要的場景循環(huán)引用。想象兩個對象A和BA內(nèi)部持有指向B的shared_ptrB內(nèi)部持有指向A的shared_ptr。這時候A的析構(gòu)要等B釋放B的析構(gòu)要等A釋放結(jié)果誰都不會被釋放內(nèi)存就泄漏了。如果讓其中一個方向的持有變成weak_ptr比如A持有B的shared_ptrB持有A的weak_ptr那么A釋放時B還能通過weak_ptr觀察A但B本身不會反向延長A的生命周期循環(huán)就被打破了。weak_ptr另一個常用場景是實現(xiàn)緩存或者觀察者模式。比如某個管理器需要保存一份對象的弱引用方便隨時檢查對象是否還活著但又不想阻止這個對象被銷毀。直接用裸指針會面臨懸空風(fēng)險用shared_ptr又可能延長生命周期weak_ptr是恰好正確的選擇。它的內(nèi)部原理也很巧妙控制塊里除了強(qiáng)引用計數(shù)還有弱引用計數(shù)。當(dāng)強(qiáng)引用計數(shù)歸零時對象先被釋放但控制塊還會保留一段時間直到弱引用計數(shù)也歸零才銷毀控制塊。這就是為什么weak_ptr可以安全地判斷對象是否存活——控制塊本身還活著只是標(biāo)記了對象已經(jīng)釋放。3. 智能指針的實操要點與避坑經(jīng)驗3.1 定制刪除器不只是delete默認(rèn)情況下智能指針會用delete來釋放內(nèi)存。但C項目里有很多資源并不是用new分配的比如打開文件得到的FILE*、用malloc分配的內(nèi)存、第三方庫返回的句柄等。這些資源需要各自的釋放函數(shù)比如fclose、free、CloseHandle。如果直接用默認(rèn)智能指針去管它會嘗試調(diào)用delete輕則資源沒正確釋放重則直接崩潰。unique_ptr的刪除器是類型的一部分你可以在聲明模板參數(shù)時指定也可以直接用自定義刪除器類型。shared_ptr的刪除器則不是類型的一部分它是在構(gòu)造時傳入的存放在控制塊里。舉個例子#include cstdio #include memory // 用 unique_ptr 管理文件指針 auto fileCloser [](FILE* f) { if (f) { fclose(f); std::puts(文件已關(guān)閉); } }; std::unique_ptrFILE, decltype(fileCloser) filePtr(fopen(data.txt, r), fileCloser); // 用 shared_ptr 管理 malloc 分配的內(nèi)存 std::shared_ptrint memPtr( static_castint*(std::malloc(10 * sizeof(int))), std::free );從這個例子里能看到定制刪除器能讓你放心地把非new資源交給智能指針管理但要注意兩個細(xì)節(jié)第一unique_ptr使用自定義刪除器會讓類型變長如果你想在容器里存放它們最好把公共釋放邏輯提取成函數(shù)對象而不是每次寫lambda第二shared_ptr雖然刪除器不影響類型但你也要避免同一塊資源用不同刪除器管理這種自相矛盾很容易引發(fā)問題。我在實際項目中還踩過一個坑給shared_ptr傳入刪除器時如果刪除器里捕獲了一些引用或者需要額外清理的資源一定要確保刪除器可以安全執(zhí)行。記得有一次我在刪除器里訪問了已經(jīng)析構(gòu)的日志對象結(jié)果資源釋放的時候直接崩潰了。正確的做法是刪除器要么是純函數(shù)要么持有自己能安全獨立存活的數(shù)據(jù)。3.2 管理數(shù)組別用錯new[]和delete[]用智能指針管理數(shù)組是一個比較容易犯錯的點。C里new T[]必須對應(yīng)delete[]否則行為未定義。std::unique_ptrT默認(rèn)刪除器調(diào)用的是delete如果管理new[]出來的數(shù)組就會出錯。正確的做法是用std::unique_ptrT[]這個特化版本內(nèi)部會用delete[]來釋放而且重載了operator[]可以直接按下標(biāo)訪問。std::shared_ptr的情況就更微妙了。在C17之前標(biāo)準(zhǔn)庫沒有提供shared_ptrT[]的偏特化當(dāng)你用shared_ptr管理數(shù)組時必須手動提供刪除器// C17 之前shared_ptr 管理數(shù)組需要自定義刪除器 std::shared_ptrint arr(new int[100], [](int* p) { delete[] p; }); // C17 之后可以直接用 shared_ptrint[] std::shared_ptrint[] arr2(new int[100]);我自己在早期代碼里就犯過直接用std::shared_ptrint arr(new int[10])然后忘寫刪除器的錯誤。表面上程序沒立刻崩但釋放時調(diào)用的delete和分配時的delete[]不配對屬于未定義行為運(yùn)行到一定規(guī)模就開始隨機(jī)出問題。排查這類問題非常痛苦因為崩潰位置往往和根因位置離得很遠(yuǎn)。建議是如果你要在堆上分配連續(xù)內(nèi)存優(yōu)先考慮std::vector它本身就管理內(nèi)存還能正確析構(gòu)元素。智能指針管理數(shù)組只適用于一些特殊場景比如不想引入vector、需要和C接口交互時。必須用智能指針時記得用unique_ptrT[]或者給shared_ptr提供正確的刪除器。3.3 從裸指針遷移到智能指針的技巧從老代碼遷移到智能指針不是簡單地把delete刪掉然后把裸指針包一層就完事了。最重要的一條原則是一個資源從誕生到死亡必須自始至終交給同一種所有權(quán)模型管理。不要讓裸指針和智能指針混用更不能從裸指針憑空構(gòu)造多個shared_ptr。我看很多人寫過這樣的代碼int* raw new int(42); std::shared_ptrint sp1(raw); std::shared_ptrint sp2(raw); // 兩個控制塊釋放兩次這種寫法幾乎必然導(dǎo)致雙重釋放。即使你只是在一個局部作用域里用shared_ptr管理一塊內(nèi)存又順手把裸指針傳給了別人別人如果在某個角落又把它包裝成一個新的shared_ptr結(jié)局也是災(zāi)難。結(jié)論就是不要相信裸指針還能繼續(xù)安全地借用給第三方除非你非常確定對方在生命周期結(jié)束前不會觸達(dá)已釋放的內(nèi)存。遷移時還有個常見的困惑成員變量應(yīng)該用unique_ptr還是shared_ptr我的經(jīng)驗是先看需求別把智能指針當(dāng)成默認(rèn)選項。如果這個對象是否有父對象、子對象的關(guān)系已經(jīng)明確比如二叉樹節(jié)點父節(jié)點擁有子節(jié)點的生命周期那用unique_ptr就夠。如果多個對象需要共享一個配置對象、連接池之類的長期資源用shared_ptr。如果只是臨時觀察一下別人的資源用weak_ptr。另一種不錯的思路是盡量讓上層對象擁有資源下層對象通過引用或者裸指針觀察只在真正需要共享所有權(quán)時才引入shared_ptr。這么做可以減少引用計數(shù)的原子操作開銷也讓代碼更直白。4. 深入底層引用計數(shù)與線程安全4.1 控制塊與對象的內(nèi)存布局shared_ptr看起來是一個很小的對象但它的內(nèi)部結(jié)構(gòu)比你想的要豐滿。標(biāo)準(zhǔn)對象內(nèi)部通常有兩個指針一個指向被管理的對象另一個指向控制塊。控制塊里保存了強(qiáng)引用計數(shù)、弱引用計數(shù)、刪除器、分配器這些數(shù)據(jù)。當(dāng)你創(chuàng)建shared_ptr時這個控制塊也會被創(chuàng)建。整個布局可以用下面這張簡化的圖理解shared_ptr 對象 ┌─────────────┐ │ 裸指針 ptr │──────? 被管理對象存放實際數(shù)據(jù) │ 控制塊指針 │──────? 控制塊引用計數(shù)、刪除器等 └─────────────┘強(qiáng)引用計數(shù)表示當(dāng)前有幾個shared_ptr在管理這個對象。當(dāng)它從1變成0時就說明最后一個擁有者也已經(jīng)放棄對象可以被析構(gòu)資源可以釋放。但控制塊并不會立刻銷毀因為可能還有weak_ptr在觀察它??刂茐K一直要等到弱引用計數(shù)也歸零才會被完全回收。這是理解weak_ptr為什么能安全判斷對象是否存活的關(guān)鍵weak_ptr并不直接知道對象的地址是否有效它只能通過控制塊里的強(qiáng)引用計數(shù)來判斷而控制塊本身還在所以這個判斷是可靠的不會訪問已經(jīng)回收的內(nèi)存。從這種設(shè)計可以看出shared_ptr相比裸指針多出來的開銷不只是引用計數(shù)本身還有控制塊的分配和管理。內(nèi)存分配的次數(shù)變多了這是性能上不可忽視的成本。這也是為什么后文要強(qiáng)調(diào)make_shared的重要性——它能減少一次內(nèi)存分配從兩個分配合并成一個。4.2 make_shared和new shared_ptr的差別很多人寫shared_ptr時喜歡直接構(gòu)造std::shared_ptrFoo sp(new Foo(42));而現(xiàn)代C推薦std::shared_ptrFoo sp std::make_sharedFoo(42);這兩種方式在表面上都能得到一個shared_ptr但底層差別很大。直接的new寫法會先分配一塊內(nèi)存給Foo對象然后shared_ptr構(gòu)造時再分配一塊控制塊內(nèi)存。也就是說這里出現(xiàn)了兩次獨立的堆分配。而make_shared會一次性分配一整塊連續(xù)內(nèi)存里面既包含F(xiàn)oo對象的數(shù)據(jù)也包含控制塊的數(shù)據(jù)。這樣做有兩個好處第一減少一次內(nèi)存分配性能更好第二由于對象和控制塊放在同一塊內(nèi)存里緩存局部性更好訪問對象時控制塊信息可能已經(jīng)在緩存中了。還有一個更隱蔽的異常安全問題??紤]這種寫法std::shared_ptrFoo sp(new Foo(42)); doSomething(); // 假設(shè)這里拋異常如果構(gòu)造函數(shù)new Foo(42)執(zhí)行成功但在shared_ptr構(gòu)造完成之前doSomething拋出異常那么new出來的Foo對象沒人管理會泄漏。用make_shared則不會有這個問題因為對象創(chuàng)建和shared_ptr管理是同一個原子步驟中間不會插入可能拋出異常的其他代碼。所以從安全性和性能兩個維度看make_shared都更合理。make_shared也不是沒有弱點。因為對象和控制塊在同一個內(nèi)存塊里只有當(dāng)弱引用計數(shù)也歸零時這塊大內(nèi)存才會整體釋放。如果你的shared_ptr已經(jīng)銷毀了但還有一個weak_ptr殘留那么Foo對象的那部分內(nèi)存其實也還沒被釋放。這在一些極端場景下會造成資源明明沒人用了內(nèi)存卻遲遲不歸還的現(xiàn)象。比如一個大對象被shared_ptr管理同時有weak_ptr長期保存著而且對象本身占用的內(nèi)存很大那么即使強(qiáng)引用計數(shù)歸零這塊大內(nèi)存也不會被釋放直到弱引用也消失。如果你的場景很在意這個可能要考慮直接用new分配控制塊讓對象可以提前釋放但這屬于少數(shù)情況下的權(quán)衡。4.3 多線程場景下的智能指針多線程下使用shared_ptr有一個容易誤解的點標(biāo)準(zhǔn)庫里shared_ptr的引用計數(shù)本身是原子操作所以多個線程同時對同一個shared_ptr做拷貝和析構(gòu)不會導(dǎo)致計數(shù)錯亂。這句話的意思是計數(shù)增減是線程安全的你不用擔(dān)心兩個線程同時減少導(dǎo)致負(fù)數(shù)。但這絕對不等于多個線程可以安全地讀取和修改被管理對象。對象本身的線程安全需要你自行通過互斥鎖、原子操作等方式保證。舉個例子兩個線程都持有一個shared_ptrint的拷貝它們指向同一個int對象。如果其中一個線程寫*sp 1另一個線程讀*sp這里沒有同步就是數(shù)據(jù)競爭行為未定義。計數(shù)安全和對象數(shù)據(jù)安全是完全兩回事。很多人誤以為用了shared_ptr就自動線程安全了結(jié)果線上出現(xiàn)奇怪的數(shù)據(jù)錯亂排查半天才意識到是自己理解錯了。另一個相關(guān)的點在于對shared_ptr對象本身的并發(fā)訪問。如果有多個線程共享同一個shared_ptr變量也就是說不是各自持有拷貝而是通過引用或指針訪問同一個shared_ptr實例那么這個實例本身的并發(fā)讀寫也是不安全的。你需要用鎖來保護(hù)它。最穩(wěn)定的模式是在多線程環(huán)境中盡量不要直接共享shared_ptr變量本身而是讓每個線程持有它自己的拷貝。因為拷貝本身是原子的引用計數(shù)增減這樣就能安全地復(fù)制所有權(quán)避免了對同一個實例的并發(fā)訪問。weak_ptr的lock()實現(xiàn)也是線程安全的。多個線程同時lock()同一個weak_ptr即使恰好對象在另一個線程中被釋放也能保證結(jié)果準(zhǔn)確——要么成功提升為有效的shared_ptr要么返回空。這是標(biāo)準(zhǔn)庫對weak_ptr::lock的原子性保證。但同樣地鎖定的也只是獲得所有權(quán)這個動作之后對被管理對象的操作仍然需要自行同步。5. 常見問題與排查技巧實錄5.1 循環(huán)引用導(dǎo)致內(nèi)存泄漏循環(huán)引用是shared_ptr最經(jīng)典的坑。我最初接觸智能指針時以為只要指針不用手動delete就萬事大吉結(jié)果用shared_ptr寫出了內(nèi)存泄漏還不自知。場景是這樣的有一個父節(jié)點類Node它持有子節(jié)點的shared_ptr子節(jié)點為了回調(diào)方便又持有了父節(jié)點的shared_ptr。這樣構(gòu)建出來的樹形結(jié)構(gòu)任何一個節(jié)點離開作用域后因為互相持有引用計數(shù)永遠(yuǎn)到不了0整棵樹的節(jié)點全泄漏了。struct Node { std::shared_ptrNode child; std::shared_ptrNode parent; ~Node() { std::printf(釋放節(jié)點\n); } }; void demo() { auto parent std::make_sharedNode(); auto child std::make_sharedNode(); parent-child child; child-parent parent; // 離開作用域時兩個節(jié)點的引用計數(shù)都是2降不下去 }釋放日志不會打印因為兩個對象互相把對方鎖死了。解決方式很簡單打破其中一個方向的強(qiáng)引用。一般來說父子關(guān)系中父節(jié)點擁有子節(jié)點所以父節(jié)點用shared_ptr持有子節(jié)點子節(jié)點要訪問父節(jié)點用weak_ptr就可以了。weak_ptr不增加強(qiáng)引用計數(shù)所以父節(jié)點被釋放后子節(jié)點里的weak_ptr會感知到對象已經(jīng)不在了訪問前通過lock()判斷一下即可。struct Node { std::shared_ptrNode child; std::weak_ptrNode parent; ~Node() { std::printf(釋放節(jié)點\n); } };用weak_ptr后parent離開作用域它的引用計數(shù)從1降到0立刻釋放child還活著但它持有的只是對parent的弱引用不會延長parent的生命周期。這個改動雖然很小卻直接避免了一場內(nèi)存泄漏。在排查自己寫的代碼時如果發(fā)現(xiàn)某個資源明明不再使用但進(jìn)程內(nèi)存只增不減優(yōu)先檢查對象之間是否存在相互的shared_ptr引用。畫一個誰指向誰的圖凡是形成環(huán)狀的強(qiáng)引用都必須用weak_ptr切斷。5.2 enable_shared_from_this的正確姿勢另一個高頻問題是一個對象已經(jīng)被shared_ptr管理了在它的成員函數(shù)內(nèi)部怎么安全地獲得指向自身的shared_ptr如果你直接在函數(shù)里寫std::shared_ptrX(this)就會在已有管理關(guān)系之外創(chuàng)建一個新的控制塊等這個臨時的shared_ptr析構(gòu)它會嘗試再次釋放對象造成雙重釋放。這個坑非常隱蔽因為你可能只在某些特殊分支里返回self運(yùn)行很久都不會觸發(fā)一旦觸發(fā)就是程序崩潰。標(biāo)準(zhǔn)答案是繼承std::enable_shared_from_thisT然后調(diào)用shared_from_this()class Request : public std::enable_shared_from_thisRequest { public: void start() { // 把自身作為回調(diào)參數(shù)傳給別的模塊 auto self shared_from_this(); callback_-invoke(self); } }; auto req std::make_sharedRequest(); req-start();enable_shared_from_this內(nèi)部的實現(xiàn)原理是這個類里面藏了一個weak_ptrT成員。當(dāng)?shù)谝粋€shared_ptr接管這個對象時它會把正確的控制塊信息寫入這個weak_ptr。之后你調(diào)用shared_from_this()實際上就是從這個內(nèi)部weak_ptr提升出一個新的shared_ptr所以不會創(chuàng)建重復(fù)的控制塊引用計數(shù)也能正確增加非常安全。使用enable_shared_from_this有幾個必須記住的約束。第一個你只能在對象已經(jīng)被shared_ptr管理之后調(diào)用shared_from_this()。如果在棧上創(chuàng)建了一個普通對象沒有經(jīng)過shared_ptr直接調(diào)用shared_from_this內(nèi)部weak_ptr是空的提升失敗標(biāo)準(zhǔn)庫會拋出std::bad_weak_ptr異常。第二個不要在構(gòu)造函數(shù)里調(diào)用shared_from_this()。因為此時控制塊還沒綁定好調(diào)用時機(jī)太早了。第三個如果你的類是多繼承請確保enable_shared_from_this被正確繼承一次不要通過多個基類引入多份不相關(guān)的能力否則可能拿到錯誤的this指針。這一塊是C里典型的看起來不難、實際陷阱很多的地方我建議你在自己的小項目里專門寫一個測試場景把棧上對象、堆對象、構(gòu)造函數(shù)調(diào)用三種情況都跑一遍印象會深刻得多。5.3 智能指針不是越多越好聊到這里估計有人會走向另一個極端所有對象全用shared_ptr能不用裸指針就不用裸指針。這個想法出發(fā)點沒錯但實踐下來會引入新的問題。第一個問題是性能開銷。shared_ptr的引用計數(shù)增減是原子操作在多線程環(huán)境下頻繁拷貝和析構(gòu)shared_ptr會帶來不小的原子操作開銷。如果你在熱路徑上大量使用shared_ptr性能表現(xiàn)可能比裸指針差很多。我見過一個網(wǎng)絡(luò)模塊每條消息都通過shared_ptr傳遞結(jié)果高并發(fā)下CPU占用明顯偏高。不是shared_ptr本身設(shè)計得差而是這個場景里共享所有權(quán)并不是必需的用unique_ptr甚至直接在棧上傳遞對象更合適。第二個問題是語義混亂。當(dāng)所有成員變量都是shared_ptr時這個類其實已經(jīng)失去了清晰的生命周期邊界。誰都可以隨便持有一份長期有效的引用結(jié)果資源被意外地延長生命周期甚至出現(xiàn)一些無法理解的引用關(guān)系。寫代碼的人自己都說不清楚某個對象到底應(yīng)該由誰銷毀。相比之下unique_ptr代表我是唯一的所有者weak_ptr代表我不擁有它只觀察它。把這些類型用準(zhǔn)確代碼本身就能表達(dá)設(shè)計意圖別人維護(hù)起來也輕松很多。我個人的經(jīng)驗是先問自己這個對象的所有權(quán)模型到底是什么再決定用哪種智能指針。如果對象只是臨時在函數(shù)里用一下直接放棧上如果確實是堆對象而且生命周期唯一用unique_ptr如果確實要共享才用shared_ptr并且配套使用weak_ptr處理不擁有但需要觀察的場景。一個項目里不可能所有對象都必須共享把沒有必要的shared_ptr替換成unique_ptr或者棧對象通常會讓代碼更清爽性能也更好。最后再分享一個排查內(nèi)存問題的小技巧如果你的程序里大量使用shared_ptr可以在編譯期臨時打開一些內(nèi)存檢測工具比如AddressSanitizer或者valgrind它們能幫你識別出雙重釋放、使用已釋放內(nèi)存等問題。但工具只是輔助根本解法還是得回到所有權(quán)模型上把誰擁有、誰觀察、誰釋放這三件事想明白。智能指針不是魔法它只是把內(nèi)存管理的規(guī)則固化到語言層面規(guī)則本身不會變變的是你不再需要靠肌肉記憶去遵守它們。踩過幾次循環(huán)引用的坑再看到weak_ptr你會有一種原來如此的融會貫通感。希望這篇筆記能幫你少走一段彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
小骚逼被操的爽不爽| 99e久久国产精品| 91xingse| 99久久精品国产高潮| 97免费在线| 日本久久999| 日韩乱码Av| 精品伊人久久久大香线蕉小说| 亚洲色图欧美一区二区不卡| 日本道人妻久久久在线不卡色视频| 啊嗯好大视频在线观看| 黄色成品网站| 亚洲综合影片| 97超碰国产精品| 国产高清成人传媒影视| 性开放中文AV高清无码免费看| 天天看天天日天天操| 亚洲国产97在线精品一区| 91/欧美| 天堂岛av| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 国产无马视频| 91九九| 超97在线精品视频| 东北丰满熟女国产一区| 性爱Av免费| 凹凸视频在线一区二区| 久久久久久九九九九| 九九九只有精品| 九九九国产| 99久久久| 日本不卡五区| 日韩性爱长视频免费| 综合网亚洲在线| 人妻 欧美亚洲| 久久宗合亚洲| 大香蕉综合网| 超碰欧美| 免费在线黄片视频| 色婷婷99| 麻豆AV一区二区| 在线天堂999| 天天影视综合网欧美精品| 91中文在线| 91在线|亚| 久久久久久91香蕉国产| 97色色,97综合| 九久久精品| 日韩欧美~中文字| 亚洲色图欧美色18直播在线| 九九无码| 黄色免费网页无码| 五月婷婷色色| 国产精品。| 久久久性爱视频| 亚洲一区制服诱惑| 日本不卡一区二区| 国产精品制服丝袜清纯唯美| 97香蕉碰碰人妻国产欧美| 久久九九综合| 91爱看| 后入精品| 国产高清午夜成人在线观看| 日韩精品黄片免费观看| 亚洲情色电影网| 神马久久中文字幕| 色综合91好| 69少妇一区二区| 色官网在线| 亚州情色j区| 99re这里只有精品3| 91麻豆一二三区| 97伊人超碰| 九九九久久久| 久久女婷| 青青伊人久久| 国产一区二区成人av在线播放| 亚洲一级特黄大片在线播放91| 婷婷五月天丁香花| 啊嗯嗯啊好大好爽| 波多野42部激情无码喷潮| 国产剧情AV不卡在线观看| 亚洲天堂中文字幕无码男同| 东北女人操比视频| 亚洲欧洲综合成人av一区| 国产高潮AA片免费看| 蜜奶av| 日天天九九天堂666| 亚洲国产精品无码AV久久久| 97自拍视频在线| 亚洲性猛交| 国产精品不卡av免费在线观看| 强奸a片网| 国产一区二区久久| 青青操网| 97色爱| 97伊人| 强奸乱伦Av网| 午夜福利合集| 乱伦系列一区二区| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 天综合网欧美| 欧美日韩在线国产在线| 女人的天堂大香蕉网| 天天日天天操天天射河南省| 夜夜操二区| 91欧| 黄页大片在线观看| 神马久久久久久| 999国产精品999| 9999九九九久久久| 大香蕉久| 久久视频,这里只有精品 | 一本一道波多野毛片中文在线| 国产欧美美女免费观看视频| 三级日韩一区二区三区| 青青青国产| 亚洲图片另类| 日本中文字幕一区| 大香蕉黄色一区| 亚洲第一男人天堂| 日韩精品.久久精品.AV女优.天美传媒 | 亚洲综合999| 青青草中文-久久青草精品一区二区三 | 嗯嗯啊啊操我| 超碰人人乐97| 日韩熟女操逼| 老鸭窝在线视频播放| 免费伦费视频在线观看| 伊人在线大香蕉视频久久| 久久riav中文精品| 日韩性爱毛片操骚逼| 97色色色综合网站| 日本免费专区| 天天综合网~91| 久操B网| 74成人在线| www被窝色com| 精品久久一区二区三区四区五区| 日韩99精品视频综合区| 97超碰影音| 开心五月天激情网| 男人高清无码一区二区| 欧美日韩亚洲天堂| 天天看人人操屄犊摸阴| 成人免费在线网站| 高潮的A片激情扒开一区| 亚洲色资源| 99热99色| 美女视频尤物网在线看| 欧洲综合色| 91亚洲精品青草| 国产极品精品美女视频| 天天综合91入口| 久久久草成人网站久久久草成人久久久草久久久 | 亚洲色综合| 日本淫乱女一区二区三区视频| 美欧老女人97| 麻豆久久视频在线地址| 欧美人妻久久精品二区三区 | 九九黄色视频在线观看| 98人妻精品一区二区色欲| 伊人 俄罗斯 a v| 色色婷| 午夜福利激情在线视频| 亚洲丝袜少妇在线| 久久久久九九九| 超碰人妻久久| 99热大香蕉伊在线| 人妻在线中出视频| 啊视频在线| 麻豆国产视频精品观看| 欧美综合亚洲综合| 偷拍99| 精品然女一区二区| 久久亚洲天天做| 婷婷五月成人| 久艹日日日| 亚洲精品黑丝| 欧美天堂超碰97| 免费夜夜爱黄色视频毛片| 乱论91| 被男人吃奶很爽的毛片| 1240青青草一区二区三区视频天爱| 欧美亚洲涩涩| 91久久国产综合精品| 亚洲天堂东京热| 日本精品第一视频在'| 操www| 久久久新亚洲AV| 日本2020一区二区| 超碰在线日韩一区| 91超碰丝袜制服| 色娱乐色呦呦夜夜夜夜av| 久久亚州高清| 国产老熟女| 麻豆久久视频在线地址| 4399成人黄A片| 激情小说成人日本无码一| 91bbb| 久久国产视频性吧 | 日本蜜桃| 性爱AV天堂| 久久久久亚洲精品| 裸模AV女优| 精品国产91久久久久久一区黄无| 日本天天人人狠狠在线日美女 | 亚洲天堂久| 加勒比五月天| 一卡二卡在线播放| 大香蕉久久| 国产97在线 | 亚洲| 91激情国产| 91女优在线观看| 欧洲亚洲人人爽爽视频| 精品无码少妇| 狠狠干91| 国产隔壁老王影院在线| 色欲av一区二区三区蜜芽| 黑人精品一区二区在线播放| 欧美极品性爱天天射| 无码黑人精品一区二区三区三| 乱伦一区二区三区‘| 亚洲熟女性高潮久久久| 五月婷婷基地| 精品久久久久,69国产成人精| 亚洲性综合9| 亚洲熟妇熟在线电影视频| 目产99999久久999| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 快播电影网日韩新片| 视频二区美腿制服人妻欧美| 97视频在线看| 欧美有码亚洲中文字幕一区二区三区四区| 日本天堂网| 日韩av色图综合| 青青欧洲黑| 怡红院久久老司机| 国产老太乱伦一区| 国产一区二区在线电影| 久久久久骚| 超碰在线97国产| 97国产综合欧美| 9Ⅰ超碰| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 插日本熟女视频| 日本三级韩三级99久久| 欧美日本天堂| 久热精品在线| 国产性爱在线视频一区二区| 色妺妺在线视频| 青青操视频在线| 蜜臀久久99精品久久综合| 人人扣人人操| 亚洲不卡三级手机播放| 亚洲成人综合在线| 97国产超碰| 丁香五月天激情综合| 91丨九色丨国产丨人妻在线| 中文字幕在线观看丝袜| 欧美在线视频观看一二三四区高清| 欧美另类丝袜熟女| 国产探花精品在线| 综合网,亚洲,欧美| 亚洲男人天堂2017| 色综合色欲色综合色综合色综合| 欧美国产一区二区三区麻豆传媒| 91香蕉国产尤物视频| 91精品国产日韩欧美综合| 欧美日韩性感| 久啪视频| 亚洲精品aa久久伊人| 少妇被玩视频二三区| 久久精品噜噜噜成人看免欧美大片| 中文操逼字幕| 欧美日韩国产中文精品字幕自在自线,| 欧美韩国你懂得在线 | 久久中久文96| 久草免费福利在线播放| 91色爽欧美| 美女黄站| 国产丝袜美女诱惑| 91看黄片| 欧美激情黑人| 人人看人人摸人人色| 被窝影院午夜看片无码| 精品妇女一区二区三区| 啊啊啊啊啊啊啊啊在线观看| 亚洲黑丝在线| 精品免费一区| 97精品国产97久久久久久免费| 黑丝制服中文字幕| 91久久99久久91熟女精品| 日韩人妻精品| 色99视频| 久久久久99999| 天天操天天射青青草| 色汉综合| 91色爽欧美| 日B操| 性色高清在线| 精品一区二区成人| 福利大香蕉| 综合一区中亚洲国产成人综合精品| 精品国产国产AV| 国产亚洲欧美每日在线| 精品人妻一区春色| 另类 日韩 熟女| 亚洲资源吧| av九九| 亚洲欧美黄| 少妇无码太爽| 久久久久人妻二区精品叶可怜| 歐美性天天| 91人妻中文| 熟女熟妇伦久久影院毛片一区二区| 狠狠中文字幕| 中文不卡视频| 9热9热综合网| 一区二区视频在线播放| 超碰午夜| 狠狠操狠狠燥| 国产女上位好爽在线| 大稥蕉免费视频这里只有精品| 久热热| 欧美少妇第一页| 激情网色| 后入国产| 快播久久人人aV| 大香蕉碰碰| 国产v片在线免费观看| 欧美综合 站| 色999亚洲人成色| 天天射天天操天天干天天吃2018| 我爱搞逼综合网| 97人人草| 手机在线观看不卡无码av| henhen91| 天天干夜夜肏| 99热精品青草在线| 日本久久精品| 无码av永久免费专区网站| 国产精品久久泡妞网站| 欧美与日韩97| 国产性刺激| 婷婷激情综合网| 国产一级特黄大片处女| 久久岛国| 人人妻人人澡人人爽久久av| 欧美 综合 亚洲| 91是天天| 99re6国产精品99re在线| 强奸乱伦av电影| 国产综合色精品在线观看| 亚洲欧美天| 日韩精品人妻系列无码天堂| 色色五月婷婷| 牛牛aV| 精品久久久久久无码| 欧美偷拍| 丰满人妻一区二区三区免费| 九久久九九久视频| 日本道日本道中文字幕日本道最新日本道在线观看 | 偷拍欧美综合| 99在线精品视频| 国模不卡| 在线观看成人性爱免费小视频| 美女啊啊啊啊啊啊| 97网色| 久久久青青草| 怡红院网站在线视频| 蜜臀久久99精品| 2025亚洲男人天堂| 欧美中文字幕男人天堂久久精品 | 婷婷亚洲综合| 五月丁香婷婷综合| 亚洲欧美精品一区天堂久久 | 精品一区二区国产日韩| 久久精品一区二区一8| 欧美日韩1234| 精品在线蜜臀| 亚洲欧美综合| 日产操逼| 亚洲激情综合另类男同| 五月婷婷丁香六月丁香| 久久综合国产精品国产| 欧美一级久久久久久久大片动画| WWW操逼| CCYY草草影院地址入口| 亚洲欧美一区二区网址| 久久久99免费| 91粉嫩萝控精品福利网站_精品影音先锋国 | 97天堂| 搡老女人老熟女91| 日本精品一级二级三级| 性爱网站一区二区| 51一区二区三区| 热99这里只有精品| 色九九九九久| 亚洲精品欧美专业| 欧美少妇高潮久久91| 亚洲日韩久久精品一区| 欧美se综合| 97啪啪| 伊人丁香五月婷婷| 懂色AV蜜臀无码精品APP| 强奸乱伦动态污图免费 | 精品国产乱码久久久影院| 97国产|免费| 成人怡红院| 成人AV超碰免费在线| 日韩一区二区高清在线观看的| 日本亚洲熟女视频| 999久久久九| 欲射影视| 在线免费观看高清无码视频| 天天操天天干一区二区 | 中国大陆国产高清AⅤ毛片| 国产小视频91| ,国产乱人伦精品一区二区三区| 国产久久日韩网站导航| 激情婷婷丁香网| 中文字幕后石码四区五区| 色欲av一区二区三区蜜芽| 熟女人妇一区二区三区| 色性综合| 高清孕妇孕交 交孕妇| 九九久久久| 免费一级黄色录像影片| 美女黄页| 東南亚性呦成人伦理资源在线视频| 凹凸视频在线一区二区| 色色婷| 清清草影| 高清国产无码av| 日本 欧美 国产一区| 夜夜狼人妻| 一本久久久精品| 2017人人操,人人摸| 九九热免费视频| 亚洲熟女一区| 成人免费视瓶| 中文字幕在线观看第二页| 美女爽到高潮91| 日韩乱伦AⅤ| 久久天天摸| 亚洲色图日韩丝袜制服一区二区五月在线| 亚洲一卡二卡在线免费| 久久婷婷国产一区二区色| 无码九九| 新婚人妻扶着粗大强行坐下| se,,,亚洲欧美| 精品人妻中文字幕高清| 亚洲男人天堂2019| 78精品在线| 无码乱人伦中文视频| 欧美性暴力猛交XXXX| 九月伊人中文字幕| 久久九九综合| 床戏久久久av一区二区麻豆| 色官网在线| 超碰视97中文| 色色香蕉| 四虎在线观看网站| 加勒比在线视频一区二区三区| 偷拍亚洲高清图片| 免费成人在线观看91| 精精夜夜| 亚洲春色欧美激情自拍| 日本一二三高清| 呦呦影院| 久久大精品乱码视频人妻熟女| 亚洲国产精品成人综合| 国产传媒一区日韩| 一本大道不卡一二三区| AV在线资源| 26uuu欧美日韩| 日本最新免费韩国1区2区视频播放| 免费av在线播放二区| 97干色天堂| 久久久久久69国产一区二区| 97伪v| 操逼视频免费日韩无码| 日本久久久精品电影| 91三级理论片播放器| 亚洲男人天堂视频| 色色色欧美| 亚洲欧美色图片| 好爽,再快点啊哈嗯嗯嗯嗯| 亚欧无码线免费观看视频| 久草资源在线视频官方总站日韩丝袜美腿| 色屁屁影院www国产| 久久久久密臀一区二区| 国产福利影视| 综合色好色| 亚洲一二三四区机械| 成人麻豆av电影网站| 久久久一区二区| 成人在线视频网| 日本操逼视频免费| 国产视频小说| 天天色综合图片| 一区二区免费电影久久| 国产超碰欧美| www老逼91| 91快色色色色色| 淫淫综合网| 欧美18禁91| 亚洲天堂无码| 日本爽爽爽爽爽爽免费视频| 人妻天天爽| 亚洲天堂女优在线| 亚洲第一无码播放立川理惠| 欧美精品成人一区二区在线观看| 国产精品乱码久久久久久久| 亚州操操穴网| 亚洲偷拍自拍在线视频| 91人妻人人澡人人爽人人精品| 久偷拍欧美日韩三区| 91丨九色丨大屁股| 日韩精品第3页| 天天看,天天做| 熟女激情综合网| 伊人性在线视频| 亚洲自拍一区夜夜操 | 91丝袜| 少妇内射视频| 亚洲AO在线| 六月丁香五月婷婷| 色综合久久88色综合久久天天| 91精品老女人| 久久久久女教师免费一区| 白丝少妇一区二区| 亚州操操穴网| 精品久久久久久亚洲| 久久一级无码精品毛片6| 国产成人欧美精品在线| 不卡二三区人妻少妇| 超碰69| 亚洲黄日韩无码专区| 欧美视频在线第3页| 国产精品成人在线| 超碰人人超在线观看| 大香蕉黄色一级片免费看| 国产高清成人免费视频| 国产精品不卡少妇白| 色欲久久99精品久久| 久久久久无码一妻区| 亚洲影院小综合| 九九玖玖精品| 丝袜综合| 99只有精品| 日韩 欧美 校园一区| AV天堂电影网| 日韩懂色网| 欧美se亚洲| 欧美色图亚州激情| 欧亚久久偷拍视频| 黄资源| 蜜臀亚洲综合一二三四区| 精产国品一区二三产品| 中文字日本乱码| 一区二区三区蜜桃成人撸久久东京热 | 大香蕉色十月| 色av中文字| 综合网,亚洲,欧美| 求求你操操我| 天天拍天| 欧美se综合| 天天爱天天操| 精品久久久av无码免费| 成人小说视频在线精品欧美| 强奸乱伦亚洲第一页| 91爆操视频| 天天干夜夜肏| 97伊人超碰| 久久东京热久久| 色姑娘综合网| 国产福利在线视频网站| 日韩黄色电影网站| 老女人爆菊| 二级久久网| 女上位精品在线| 亚洲精品91| 黄色免费一级在线毛片| 日韩丰满熟妇| 国产剧情一区在线观看| 60秒试看最爽10分钟网站| 久久超碰av在线| 熟妇人妻一二三区免费| 国产在线能看的你懂的| 高跟丝袜AV专区国产| 深爱五月婷婷| 黄色十八禁网站| 久超碰这里只有精品| 999综合网| 国产人妖视频一区在线观看| 五月婷婷六月激情| 加勒比AV天堂| 97在线视频免费| 91在线超高颜值国产| 色五月婷婷中文字幕| 操我啊啊啊啊啊| 九九亚洲色在线观看| 99国产精品| 性爱乱伦一区| 亚洲色图加勒比| 日天天九九天堂666| 欧美亚洲素人制服精品| 国内91熟女人妻丝袜天天精品视频在线| 99综合自拍| 变态综合色| 福利操逼| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 一区二区娱乐网站| 精品亚洲俞拍视频一区| 一本久道久久综合狠狠爱一密臀精| 人人妻人人爽 97人人看碰人免费公开视频| 人人摸人人干人人拍97| 欧美色图亚州激情| 国产成人久久精品蜜臀| 午夜男人一级A片7777| 97自拍一区| 亚洲天堂男人天堂| 国产日韩欧美三级片| 91成人国产综合久久精品蜜月| 另类欧美色| 女人双腿搬开让男人桶| 欧美日韩亚洲五月天婷婷| 久久狠狠色噜噜狠狠狠狠97| 亚洲,欧美,综合网| 国产一区在线观看无码AV| 色鬼在线综合| 无遮挡男女激烈动态图| 91蜜臀熟女| 78m成人视线| 免费看欧美美女黄色大片 | 亚洲砖码砖专无区2023| 97伪v| 不卡中文字幕aⅴ在线| 日韩pv中文| 香蕉人欧美综合| 黄污污污污| 亚洲熟女av中文字幕| 柠檬AV导航| avav青青草久久夜| 91日本在线观看| 麻豆天天躁天天揉揉AV| www.婷婷五月天| 无码人妻一区二区三区四区老鸭窝| 懂色AV蜜臀无码精品APP | 天天看天天在线精品| 天堂在线一区二区| 亚洲色系另类精品国产| 日韩少妇无吗| 最新日产中文在线麻豆| 精品人妻视频一区二区在线播放| 亚洲最新av无码成人精品区 | 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 白嫩91在线亚洲| 婷婷视频网| 我想要 啊 啊 啊| 中文字幕91综合| 国产精品麻豆成人av| 操B久久| 爽极品影院| 欧美色道啊| 久久精品人体AV| 在线亚洲 欧美 日本专区| 欧美72网页| 亚洲精品aa久久伊人| 99re这里只有| 亚洲不卡av在线| 婷婷去俺也去六月色| 久久精品女同亚洲女同13| 五月天婷婷久久| 国产一级舔足在线观看| 日日骚精品视频| 久久久婷婷婷| 色综合98| 欧美日韩国产三级黄色| 久久久久女教师免费一区| ′ !γ}丶。。久久精品欧美一区二区三区 | 国产黄片精品在线| 麻豆熟妇乱妇熟色A片在线看 | 国产黄色剧情影片麻豆免费播放| 91在线/欧洲| 99免费在线视频| 国产一区二区在线播放量| 极品一区二区三区免费| 久99久视频精选| blacked精品一区国产| 欧美色另类| 亚熟hd视频在线| 欧美日不卡| 约操熟妇| 亚洲欧美日韩制服另类| 九九超碰综合网| 日日日啊啊啊| 91GD.COM| 亚洲av综合色| 国产精品免费久久久久久久久久| 伊人在线大香蕉二。| 电影69乱码96| 色婷网| 乱伦av.com| 国产成人欧美精品在线| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 97精品视频免费| 日本免费不卡二区| 精品97精品97| 亚洲天堂日本| 成人网址在线观看| 亚洲黄片免费在线播放| 国桃视频产巨乳精品一区二区在线| 久久久精品无码亚免费| 激情一区二区| 欧美熟女逼久久久久久| 国产精品久久久久久夜夜夜| 日本在线视频导航| 免费视频在线一区二区不卡| 五月天精品| 大香蕉在线免| 亚州色图第三区| 色综合av男人天堂| 黄色免费一级在线毛片| 2017天天插| 亚洲在钱| 欧美 综合 亚洲| 双插在线| 91麻豆天美国产| 首页亚洲国产高跟丝袜诱惑视频| 中文字幕日韩人妻视频一区二区三区| 男人在线天堂| 精品欧美乱码久| 日韩综合第八区国产精品| 精品999日本| 一区 欧美 日韩 麻豆| 男人夜色天堂ss| ai欧美亚洲小说| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 亚洲男人电影天堂| 97超碰欧美精品| 97国产精选| 制服丝袜第二页| 欧美伦乱爱| 2025亚洲男人天堂| 亚洲色欲一区二区三区| 亚洲 图片 综合91| 日韩三级一区 | 大吊色| 国产精品女同| 日韩乱码av| 日韩草久视频| 人人爱夜夜爱| 丝袜喷水在线| 欧美色997| 蜜臀久久久国产| 青娱乐手机日韩在线视频| 99热免费精品| 96久久科窝| 超碰在线974| 欧美精品 - 91爱爱| ai欧美亚洲小说| 久久一二三四五六七八九区| 性感美女91影视| 婷婷午夜清品久久久久久久性色视频观| 91亚洲综合在线| 精品人妻av区天天看片| 91一区二匹| 国产强奸AV在线| 一级片在线观看高清无码| 国产亚洲女v在线观看| 乱伦Av网| 婷婷五月天小说| 67194无码不卡| juliaann丝袜大战黑鬼| 99热大香蕉伊在线| 激情小说激情视频| 黑人美精品 A片| 女人午夜视频777| 高清不卡国产| 色香综合天天影视综合 | 无码人妻丰满热妇又大又粗| 九九热在线视频| 欧美激情超碰777| 人妻喷水| 久久久久久99AV无码免费网站| 亚洲中文一区二区三区| 97人肏| 啊啊啊啊啊舒服| 搡老熟女免费视频| 亚洲 欧美 手机在线观看| 亚洲日韩肥臀视频在线观看| 国产精品国产| 一级性爱视频免费观看| 人、人、摸,人、人、草| 欧美在线伊人色| 久久三区四区| 国产欧美岛国精品一区| 欧美三级一级| 国产精品一区在线播放| 囯戸精品高潮呻吟旡码| 欧日韩不卡视.频| 久久久久久久9最新免费视频观看| 亚州综合网| 激情五月综合| 久久久九精品| 午夜呻吟欧美| 97中文热色| 亚洲午夜福利在线影院| 99re这里只有精品中心播放| 啊啊啊轻点在线观看| 伊人黄色片| 久久久亚洲精品电影免费看| 99热精品在线观看| 色伊人91| 日本东京热大香蕉a片| 欧美性天天| 狠狠色丁香| 黄页网站成人免费| 国产美女mm131爽爽爽爽| 欧美久久毛片基地| 免费a v| 亚洲男人天堂Av| 久久中文字幕人妻熟av女蜜柚| 国产精品成人无码a v毛片| 日韩伦理视频| 亚洲国产精品久久AV| 精品国产乱码久久久久久久久1| 天天操熟妇| 91久久精品中文字幕| 欧美综合网1| 草草影院最新网址| 91天美传媒精品| 岛国黄片网站| 国产福利夜| 91东京热男人的天堂| 超碰 另类 欧美 | 国产亚洲国产超碰| 青青操日韩| 日本污ww视频网站| 少妇精品| 91在线欧色| 国产无码精品久久久久久| 天美国产精品| 人人弄人人摸| 日韩精品人妻中文字幕久久久| 十八禁视频一区二区| 99国产精品免费| 国产人伦a片信息免费片| 亚洲性少妇| 日韩欧美亚洲一区二区三区影院| 麻豆区久久久久亚| 久久五月综合| 九九九色| 日韩精品9999| 国产91久久九九免费精品无码| 久草电影网| 五月丁香婷婷啪啪| 2019天天干| 精品九九九九九九九| 国产欧美精选激情视频| 日本精品一区二区三| 久久综合九九| 女性喷水高潮在线观看| 伊人991| 国产综合操逼高清| 天天综合中文字幕 91| 婷婷色香| 国产亚洲禁久一区二区| 亚洲久久久| 嗯嗯,好大,好爽,好骚| 把腿张开老子CAO烂你| 欧中美三级一区二区三区| 97中文天堂| 1禁看欧美黄片免费看| 变态综合色| 国产精品色哟哟| 蜜臀久久精品久久久久视频| 国产久久久久久久久一区二区| 国产一区二区二区按摩精品啪视频| 日韩久久超碰色| 亚洲偷拍自拍在线视频| 伊人国产成人av网站| 青青青草伊人精品| 97亚洲国产影视| 精品v日韩欧美国产| 91亚洲欧洲| x97av| 一牛影视久久久一区二区三区| 中文字幕一区电影在线观看| 欧美综合另类| 欧美亚洲清纯| 青青草伊人久久| 久久久中文| 亚洲第一免费视频| 2019天天干| 久超碰这里只有精品| 欧美狠狠操| 久久久草成人网站久久久草成人久久久草久久久 | 黄片视频观看| 91热热色| 加勒比色综合| 97久久久精品| 丰满人妻一区二区三区在线| 全球成人中文在线| 大香蕉一区二区在线观看.| 风韵犹存大大大大香蕉| 智利AV在线网| 97视频www| 亚洲三级网址久久最新| 91麻豆天美国产欧美| 在线看免费无码AV天堂的| 国产在线视频二区| 国产无码久久高清| 不卡在线观看视频| 91日产桃蜜| 91色综合色| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 成人线上超碰| 国产精品欧美在线观看| 日日骚av| 蜜臀99久久精品| 久久中久文96| 久草久日| 九九九草| 久久是精品| 天美麻豆黄色录像| 久久精品视| 欧美色图在线视频少妇| 中文一区在线日| 亚洲和欧美裸体美女双飞视频| 天天干天天日天天射黄色大片| 久超碰在| 啪啪视频mP4| 欧美综合第一| 色天使大香蕉| 久久999久| 欧美国产有色电影| AV99热18这里只有精品| A男人的天堂| 热热色色综合| 91青青在线视频| 91热色| 东京热,男人的天堂| 熟妇一区二区| 欧美天天| 偷拍三区| 激情综合网五月婷婷五月天| 国产69精品久久久久99尤物| 亚洲综合中文字幕有码| 国产在线精品偷| 丁香九月婷婷| 后入美女国产| 人妻无码后入| 日本最新1区2区3区| 人妻喷水| 中文字幕乱码在线观看| 久久78| 欧美综合国产精品久久丁香| 久久黄色视频一区二区三区| 日本欧美亚洲高清在线看| 日本 欧美 国产一区| 日本高清电影欧美色图| 不卡九肏| AV久日| 人妻一区二区三区熟女| 国产精品一区二区手机看片| av天堂天堂av日韩| 亚洲色诱惑| 久久色激情一区二区三区| 国产精品高潮久久AV| 伊人四虎综合| 999999精品| 美女视频尤物网在线看| 欧美顶级黄片AAAAA在线免费看| 97WW精品| 超碰97首页| 亚洲毛片基地专区| 婷婷丁香九月| 亚洲男人天堂Av| 欧日韩在线观看| 蜜臀AV午夜精品久| 欧美精品日韩久久久九| 色墦五月丁香| 亚洲男人的天堂网| 亚洲综合在线第一页| 欧美1区二区三区公司| 大香蕉黄色一区| 精品国产一区二区三区久久久蜜臀 | 天天综合网亚洲综合网| 97精品网| 国产黄色av大片网站| 极品白嫩福利在线| 91麻豆天美国产欧美高潮| 强奸乱伦免费网站| 人妻嗯啊啊在线播放| 五毛骚逼极品美女怕怕| 久久专区| 日韩av乱伦| 在线中文AV| 国产成人91一区二区三区| 丁香五月激情综合国产| 一区二区三区蜜桃成人撸久久东京热| 超碰久超碰久| 强奸乱伦大香蕉网| 国产精品91ai| 久久这里只有精品9| 日本一区二区不卡精品| 中文字幕片| 精品日韩| 啪啪啪大香蕉| 欧美伦乱| 奇米狠999| 久久香蕉超碰97国产精品| 超碰色综合| 亚洲无码99| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 成人av福利在线观看| 青青操青娱乐| 亚洲熟女人妻中文字幕一区二区 | julia国产在线 | 人妻精品一区二区| 国产超碰人人操| 亚洲综合色在线| yellow网站免费观看日韩高清无码| 人妻无码后入| 超碰97人妻免费在线| 怡红院视频在线| 欧美不在线| 激情丁香五月| 久久啊啊啊| 蜜桃臀av在线观看| 欧美天天影院| 大香网伊人久久综合| 日1区2区3区2020| 国产大学生高潮在线播放| 日韩丨制服丨中文|在线| 少妇高潮对白在线观看| 亚洲在钱| 97国产成人精品免费视频| 日夜尻逼网| 高清国产av无码| 亚洲黄色电影| 看日韩美女二区三区免费操逼视频| 欧美色图另类图片| 亚洲va综合va国产va中文| 亚洲视频精选| 中文字幕艹艹| 久久久久久久九九九九九九| 亚洲精品国产精品乱码不卡| 精品毛片av一区二区| 人妻丝袜肏逼| 黄色高清无码无码破解免费暗网| 亚洲中文字幕一区| 婷婷综合五月| 五月婷亚洲精品天堂| 亚洲91亚洲| 亚洲一区二区三区中文字幕| 99re6国产精品99re| 国产情侣自拍在线播放| 国产路线专区| 熟妇人妻一区二区| 777AV电影| 18精品一二区| 日韩女优中文字幕| 最新岛国大片| 精品9999| 日本在线不卡123| 亚洲精品乱码线路中文字幕| 91精品人妻啪啪间| www.yw尤物| a片偷拍视频| 久久机热| 精品国产乱码久久久久久影片| 国产无吗在线播放| 97人妻人人躁人人玩人人| 天天综合网一91网| 北约熟女超碰| 亚洲小说视频| 欧美伦乱爱| 99热99色| 极品综合| 操熟女91| 金典av| 欧美性特| 多毛小伙内射老太婆| 色97干| 久久99精品九九久久久婷婷| 色色色欧美| 爽极品影院| 91综合网站| 精品二区三四区五电影| 美日韩一卡二卡三卡免费人妻精品| 亚洲高清无码在线桃色| 欧美人妻少妇| 美国三级日本三级久久99| 久妇网| 综合色啪| 2020中文在线一区二区三区| 97人人爱人人乐| 国产女人9999| 中文字幕丝袜美腿| 婷婷五月天av| 亚洲AV噜噜狠狠网址蜜桃动漫| 91性色| 999久久久久久久久| 啊操爽品善一区二区三区| 日本三级韩国三级99| 一区二区三区免费岛国片| 蜜臀无码视频在线观看| 日曰骚久久精品| 精品人妻一二三四区视频| 中文字幕日产av人| 丁香婷婷久久| 日韩亚洲Av人人夜夜澡人人爽| 亚洲欧洲无码bt精品合集| 国产白丝AV| 91蜜臀人妻中文字幕在线| 日韩色图 一区二区| 日日骚 av| 日韩AV一区二区三区三州三州| 久久久婷| 综合欧美日本三级| 在线观看AV片| 亚洲一曲日韩精品| 色就色综合| 尤物视频一区| 日本爽爽爽爽爽爽免费视频| 操一操摸一摸| 中文字幕蜜乳av| 国语少妇精| 青青青青操国内视频在线| 狠狠色五月亚洲91| 91色伦| 91中出在线| 久久r精品| 日韩中文字幕精品一二三事国产精品| 婷婷月色| 天天日骚逼熟女| 91影视亚洲| 午夜无码熟妇丰满人妻| 人人搡人人肉久久精品| 天天综合网91入口| 夜夜高潮夜夜爽高清视频一 | 超碰97最新人妻| 国产精品suv一区| 亚洲精品欧洲精品| 蜜桃不卡一区二区| 欧美成人色| 99re这里| 欧美激情一| 欧美色97| 久久粉色| 国产成人在线观看网址| 狠狠操狠狠操操| 91视频伊人| 久久久亚洲高清不打码| 最新日产中文在线麻豆|