围绕shared_ptr构建对象系统

发布于 2024-11-03 23:58:26 字数 290 浏览 3 评论 0原文

我正在使用 shared_ptr 作为我正在开发的玩具语言的垃圾收集,该语言可编译为 C++。我的对象派生自上面的公共基类,其中有字符串和数字,然后有向量和地图。 C++ 端的所有内容都包装在 shared_ptr 中传递,因此我的容器实际上保存 shared_ptr,这样当它们被销毁时,它们的内容也会被销毁。这个方案是有效的,但感觉有点奇怪,因为作为基础对象的容器持有 shared_ptr 。我的设计有缺陷吗?如果是的话,围绕这种方法的替代层次结构是什么?

I am using shared_ptr as my garbage collection for a toy language that I am working on which compiles to C++. My objects derive from a common base class above that there are strings and numbers then there are vectors and maps. Everything on the c++ side is passed wrapped in shared_ptrs so my containers actually hold shared_ptr so that when they get destroyed their content is destroyed too. This scheme works but it feels a bit weird in that containers that are base objects are holding shared_ptrs. Is there a flaw with my design? If yes what would be an alternative hierarchy around this approach?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

圈圈圆圆圈圈 2024-11-10 23:58:26

以下是我的设置方法:

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 的引用计数就会为您提供适当的垃圾回收。

Here's how I'd set this up:

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
}

Note that ToyLang arrays in this scheme are vectors of pointers, giving the language reference semantics. This is in fact quite common in dynamic languages: Lisp, Python, and others work like that. As long as you don't have circular references, shared_ptr's reference counting will give you proper garbage collection.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文