我正在使用 shared_ptr
作为我正在使用的玩具语言的垃圾收集器,它可以编译为 C++。我的对象派生自上面的一个公共(public)基类,其中有字符串和数字,然后有 vector 和映射。 c++ 端的所有内容都包装在 shared_ptr
中传递,因此我的容器实际上包含 shared_ptr
以便当它们被销毁时,它们的内容也会被销毁。这个方案可行,但感觉有点奇怪,因为作为基础对象的容器持有 shared_ptr
。我的设计有缺陷吗?如果是,围绕这种方法的替代层次结构是什么?
最佳答案
我是这样设置的:
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 数组是指针 vector ,提供语言引用语义。这实际上在动态语言中很常见:Lisp、Python 和其他语言都是这样工作的。只要您没有循环引用,shared_ptr
的引用计数就会为您提供适当的垃圾回收。
关于c++ - 围绕 shared_ptr 构建对象系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5844315/