為什麼要用 enable shared from

2021-05-24 01:52:15 字數 2602 閱讀 4104

樓主 hma

(if you think you can, you can.)

☆─────────────────────────────────────☆

panrainbow (憂鬱淡藍) 於  (tue nov  9 11:48:38 2010)  提到:

引入enable_shared_from_this的原因是可以實現返回值為指向該類本身的

shared_ptr,為什麼以this為拷貝構造函式引數不能完成引用計數的累加,而是用

weak_ptr卻可以呢?

謝謝!☆─────────────────────────────────────☆

xiaoman (比目魚) 於  (tue nov  9 12:16:25 2010)  提到:

enable_shared_from_this其實是乙個簡單的class,其內部包含指向自己的weak_ptr

加上enable_shared_from_this以後,其實是用了多重繼承,

而且這個多重是有成員變數的(不是很好的習慣)

至於你說的問題,不明白「以this為拷貝構造函式引數不能完成引用計數的累加」

放乙個簡單**上來看看

【 在 panrainbow (憂鬱淡藍) 的大作中提到: 】

: 引入enable_shared_from_this的原因是可以實現返回值為指向該類本身的

: shared_ptr,為什麼以this為拷貝構造函式引數不能完成引用計數的累加,而是用

: weak_ptr卻可以呢?

: ...................

☆─────────────────────────────────────☆

panrainbow (憂鬱淡藍) 於  (tue nov  9 12:28:13 2010)  提到:

//可以實現引用計數累加

shared_ptrshared_from_this()

//不能實現引用計數累加

shared_ptrshared_from_this()

請問這是為什麼?

【 在 xiaoman (比目魚) 的大作中提到: 】

: enable_shared_from_this其實是乙個簡單的class,其內部包含指向自己的

weak_ptr

: 加上enable_shared_from_this以後,其實是用了多重繼承,

: 而且這個多重是有成員變數的(不是很好的習慣)

: ...................

☆─────────────────────────────────────☆

xiaoman (比目魚) 於  (tue nov  9 12:58:41 2010)  提到:

第2種寫法是錯的。這種特性是由shared_ptr的建構函式決定的,

可以這麼理解:

如果shared_ptr通過裸指標t*來構造,那麼代表的是這個shared_ptr完全擁有它,

如果看進去相應的建構函式可以看到會new乙個新的計數器結構體,

之後的結果就是對this至少多delete一次

簡單**可以這麼描述:

template class shared_ptr;

...private:  t* px; ///raw pointer

ref_pn* pn; /// ref count struct

}如果用weak_ptr構造,能工作是因為shared_ptr寫了乙個特殊建構函式,

接受從weak_ptr構造自己,

這個特殊建構函式會從weak_ptr裡找到引用計數結構體,並增加計數。

public:

shared_ptr(weak_ptrpw)

【 在 panrainbow (憂鬱淡藍) 的大作中提到: 】

: //可以實現引用計數累加

: shared_ptrshared_from_this()

: {: ...................

☆─────────────────────────────────────☆

xiaoman (比目魚) 於  (tue nov  9 13:02:41 2010)  提到:

剛才偽**寫得有些問題,更新了

【 在 xiaoman (比目魚) 的大作中提到: 】

: 第2種寫法是錯的。這種特性是由shared_ptr的建構函式決定的,

: 可以這麼理解:

: 如果shared_ptr通過裸指標t*來構造,那麼代表的是這個shared_ptr完全擁有它,

: ...................

☆─────────────────────────────────────☆

panrainbow (憂鬱淡藍) 於  (tue nov  9 13:55:42 2010)  提到:

明白了,謝謝前輩指教

【 在 xiaoman (比目魚) 的大作中提到: 】

: 剛才偽**寫得有些問題,更新了

為什麼要用補碼

在探求為何機器要使用補碼之前,讓我們先了解原碼,反碼和補碼的概念.對於乙個數,計算機要使用一定的編碼方式進行儲存.原碼,反碼,補碼是機器儲存乙個具體數字的編碼方式.原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 原 1000 ...

為什麼要用AndroidStudio

原因一 android studio是基於intellij idea開發的,所以android studio繼承了intellij idea的所有功能.原因二 android studio是谷歌開發的,專門用於android開發的編輯器,換句話說是親兒子,谷歌會把所有好吃的好用的先給親兒子.原因三 ...

為什麼要用Handler

一 什麼是handler?注 執行緒分為主線程 主線程又叫ui執行緒,只能有乙個主線程 和子執行緒 可以有多個 handler只能在主線程裡執行 handler是android給我們提供用來更新ui的一套機制,也是一套訊息處理機制,我們可以發訊息,也可以通過它 處理訊息。二 為什麼要用handle?...