我正在使用shared_ptr
作为我正在处理的玩具语言的垃圾收集,它编译为C ++。我的对象派生自上面的公共基类,有字符串和数字,然后有矢量和地图。 c ++方面的所有内容都包含在shared_ptr
中,因此我的容器实际上保存shared_ptr
,这样当它们被破坏时,它们的内容也会被破坏。这个方案有效,但是作为基础对象的容器持有shared_ptr
s感觉有点奇怪。我的设计有缺陷吗?如果是,那么围绕这种方法的替代层次结构是什么?
答案 0 :(得分: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
的引用计数将为您提供适当的垃圾回收。