gpt4 book ai didi

c++ - 如何处理指针成员的不同所有权策略?

转载 作者:行者123 更新时间:2023-11-30 01:31:15 25 4
gpt4 key购买 nike

考虑以下类结构:

class Filter
{
virtual void filter() = 0;
virtual ~Filter() { }
};

class FilterChain : public Filter
{
FilterChain(collection<Filter*> filters)
{
// copies "filters" to some internal list
// (the pointers are copied, not the filters themselves)
}

~FilterChain()
{
// What do I do here?
}

void filter()
{
// execute filters in sequence
}
};

我在库中公开这个类,所以我无法控制它的使用方式。

我目前遇到一些关于 Filter 对象所有权的设计问题 FilterChain 持有指向的指针。更具体地说,以下是 FilterChain 的两种可能使用场景:

  • 场景 A:我的库中的一些函数正在构建一个(可能很复杂的)过滤器链,根据需要分配内存,并返回一个新分配的 FilterChain 对象。例如,其中一个函数从一个文件构造一个过滤器链,它可以描述任意复杂的过滤器(包括过滤器链的过滤器链等)。该功能的用户负责在工作完成后销毁对象。
  • 场景 B:用户可以访问一堆 Filter 对象,并希望以特定方式将它们组合到过滤器链中。用户构造 FilterChain 对象供自己使用,然后在用完后销毁它们。当引用它们的 FilterChain 被销毁时,Filter 对象不得被销毁。

现在,在 FilterChain 对象中管理所有权的两种最简单的方法是:

  • FilterChain 拥有 Filter 对象。这意味着 FilterChain 引用的对象在 FilterChain 的析构函数中被销毁。这与场景 B 不兼容。
  • FilterChain 拥有 Filter 对象。这意味着 FilterChain 的析构函数什么都不做。现在场景 A 出现了问题,因为用户必须知道所涉及的所有 Filter 对象的内部结构,以便将它们全部销毁而不遗漏一个,作为父级 FilterChain 不会自己做。那只是糟糕的设计,并要求内存泄漏。

因此,我需要更复杂的东西。我的第一个猜测是设计一个带有可设置 bool 标志的智能指针,指示智能指针是否拥有该对象。然后,FilterChain 不是获取指向 Filter 对象的指针集合,而是获取指向 Filter 对象的智能指针集合。当 FilterChain 的析构函数被调用时,它会销毁智能指针。然后,智能指针本身的析构函数将销毁指向的对象(Filter 对象)当且仅当指示所有权的 bool 标志已设置。

我感觉这个问题在 C++ 中很常见,但我在网上搜索流行的解决方案或巧妙的设计模式时并不是很成功。事实上,auto_ptr 在这里并没有真正的帮助,shared_ptr 似乎有点矫枉过正。那么,我的解决方案是不是一个好主意?

最佳答案

这里的智能指针并不过分:显然,您有一个设计问题,需要以某种方式仔细考虑对象的生命周期和所有权。如果您希望能够在运行时重新修补过滤器图中的过滤器,或者能够创建复合 FilterChain 对象,则尤其如此。

使用 shared_ptr 将一次性消除大部分问题,并使您的设计更加简单。我认为这里唯一可能存在的问题是您的过滤器是否恰好包含循环。如果你有某种反馈循环,我可以看到这可能会发生。在这种情况下,我建议让所有 Filter 对象都归一个类所有,然后 FilterChain 将存储指向 Filter 对象的弱指针。

我敢打赌,过滤阶段的执行时间将远远超过取消引用智能指针的额外开销。 shared_ptr 被设计得非常轻量级。

关于c++ - 如何处理指针成员的不同所有权策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3356456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com