2011-04-30 60 views
1

我使用shared_ptr作爲我正在編寫的C++編寫的玩具語言的垃圾回收。我的對象來自一個公共基類,上面有字符串和數字,然後是矢量和地圖。在C++端的所有東西都被包裝在shared_ptr中,所以我的容器實際上保存着shared_ptr,這樣當它們被銷燬時,它們的內容也被銷燬了。這個方案的工作原理,但是它感覺有點奇怪,因爲基礎對象的容器持有shared_ptr。我的設計有缺陷嗎?如果是,那麼圍繞這種方法的替代等級是什麼?建立一個圍繞shared_ptr的對象系統

+0

*上面*公共基類是字符串和數字嗎?請顯示一些代碼或一個小圖。 – 2011-04-30 20:08:11

+0

我不認爲我會使用'shared_ptr'來完成這個複雜的事情。我會考慮使Object是一個引用計數的基類,並使用類似於Boost的intrusive_ptr或OpenSceneGraph的ref_ptr。 – 2011-04-30 21:25:28

+0

那麼你的玩具語言在你創造一個循環參考的那一刻就落下了嗎? – jalf 2011-05-01 00:57:16

回答

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