我使用shared_ptr
作爲我正在編寫的C++編寫的玩具語言的垃圾回收。我的對象來自一個公共基類,上面有字符串和數字,然後是矢量和地圖。在C++端的所有東西都被包裝在shared_ptr
中,所以我的容器實際上保存着shared_ptr
,這樣當它們被銷燬時,它們的內容也被銷燬了。這個方案的工作原理,但是它感覺有點奇怪,因爲基礎對象的容器持有shared_ptr
。我的設計有缺陷嗎?如果是,那麼圍繞這種方法的替代等級是什麼?建立一個圍繞shared_ptr的對象系統
1
A
回答
1
下面是我此設置:
namespace toylang {
class Object;
// main handle type; use this for all object references
// replace with boost::intrusive_ptr or similar if too inefficient
typedef std::shared_ptr<Object> obj;
class Object
{
// whatever
};
class Number : public Object
{
int x;
// etc
};
class Array : public Object
{
std::vector<obj> a;
// etc
}
注意,在這個方案中ToyLang數組指針的載體,賦予語言參考語義。實際上,這在動態語言中很常見:Lisp,Python和其他類似的工作。只要你沒有循環引用,shared_ptr
的引用計數會給你適當的垃圾收集。
+0
無法GC循環引用是非常重要的,國際海事組織。一般來說,你可以使用'weak_ptr'來處理這個問題,但是在一般情況下對任意輸入進行處理並不容易。 – 2011-04-30 21:19:26
+0
@Tim:對於一種玩具語言來說,它可能不是很重要,並且有一些特定領域的語言是不可能的。 Python仍然使用引用計數和單獨的GC來清理垃圾引用計數留下的內容。 – 2011-04-30 23:39:55
相關問題
- 1. 旋轉圍繞fabric.js另一個對象的另一個獨立的對象
- 2. 與一個對象建立關係
- 3. 圍繞一個對象在javascript中圍繞一個3d攝像機
- 4. 建立一個插件系統用PHP
- 5. 建立一個對象
- 6. 圍繞每個pdf頁面建立一個容器
- 7. 在統一中圍繞其中心點旋轉對象3d
- 8. 圍繞一箇中心對象旋轉對象
- 9. TCPDF圍繞對象環繞文本
- 10. three.js所 - 創建一個圍繞管幾何立方體
- 11. 一個簡單的對象系統
- 12. 創建一個數據對象關係系統
- 13. 圍繞鼠標旋轉多個對象
- 14. Boost shared_ptr不會立即銷燬對象
- 15. webgl在一個座標軸上圍繞另一個對象旋轉對象
- 16. 環繞一個對象
- 17. 創建一個系統定義的對象(Enum)
- 18. 圍繞一個點
- 19. 圍繞一個JFrame
- 20. 如何設置類與範圍集中的至少一個對象建立一對多關係
- 21. Three.js圍繞一個球體旋轉一個立方體
- 22. 如何建立一對一的關係
- 23. 將玩家對象圍繞玩家對象移動一個光滑的圓圈
- 24. 系統類中的對象創建
- 25. 圍繞UIButton創建一個CAShapeLayer?
- 26. 圍繞UIView創建一個光暈
- 27. 如何建立一個JSON對象
- 28. 建立一個對象不使用「新」
- 29. 圍繞一個div絕對定位
- 30. 圍繞svg中的對象傾斜
*上面*公共基類是字符串和數字嗎?請顯示一些代碼或一個小圖。 – 2011-04-30 20:08:11
我不認爲我會使用'shared_ptr'來完成這個複雜的事情。我會考慮使Object是一個引用計數的基類,並使用類似於Boost的intrusive_ptr或OpenSceneGraph的ref_ptr。 – 2011-04-30 21:25:28
那麼你的玩具語言在你創造一個循環參考的那一刻就落下了嗎? – jalf 2011-05-01 00:57:16