我想用一個類似指針的對象對於「所有權」和「引用」,不同類型的shared_ptr更好嗎?
Ownership<Type> m_foo
對所屬對象和處理
Reference<Type> m_someFoo
在另一種情況下一個經典的「指針」,而我參考應該知道原始對象何時不再存在(例如,通過返回nullptr),並且還應該可以防止原始對象在很短的一段時間內被刪除(鎖定)。
我知道shared_ptr的(所有權)和的weak_ptr(參考)提供類似的功能。然而,鎖定一個weak_ptr並訪問原始ptr涉及創建一個shared_ptr,這是相當緩慢的。另外,我不能決定在訪問原始ptr之前不鎖定weak_ptr(例如,在知道該對象現在沒有被刪除的情況下)。
是否明智實現所有權和參考如下:
- 所有權知道(如
std::list<Reference<Type>*>
) - 當所有的對象衰減,這些公司參考 S的地址參考 s設置爲nullptr
- 參考包含PTR到
uint m_lockCount
在所有權 - 在鎖定時,
m_lockCount++
,一旦解鎖m_lockCount--
- 所有權不能釋放對象時
m_lockCount != 0
這種解決方案將是特別少可行參考實例和高訪問率通過參考 s。
「涉及創建相當慢的shared_ptr」。你知道爲什麼它很慢嗎?當擁有對象衰減時,這些引用被設置爲nullptr,引用包含所有權中的uint m_lockCount的ptr,在鎖定m_lockCount ++時,在解鎖m_lockCount時,所有權無法在m_lockCount!= 0時釋放對象。 另外,我敢打賭它比你想象的要快得多。 –
你所描述的一切正是'shared_ptr'和'weak_ptr'被設計爲你處理的。按原樣使用它們,不要嘗試手動複製它們。鎖定一個'weak_ptr'確實會創建一個新的'shared_ptr',但是創建速度很快,因爲它共享原始'share_ptr'的數據指針,增加它的refcount直到複製的'shared_ptr'超出範圍。當鎖被激活時,refcounting的要點是快速複製並且不釋放擁有的對象。 –
不要重新實施車輪。 –