考虑以下类结构:
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
对象供自己使用,然后在完成后销毁它们。当引用它们的对象被销毁时,这些Filter
对象不能被销毁。FilterChain
现在,管理对象所有权的两种最简单的方法FilterChain
是:
FilterChain
拥有Filter
对象。这意味着 所引用的对象FilterChain
在FilterChain
的析构函数中被销毁。这与场景 B 不兼容。FilterChain
不拥有这些Filter
对象。这意味着FilterChain
' 的析构函数什么都不做。现在方案 A 存在一个问题,因为用户必须知道所有Filter
涉及的对象的内部结构才能在不遗漏任何一个的情况下将它们全部销毁,因为父对象FilterChain
本身不会这样做。那只是糟糕的设计,并要求内存泄漏。
因此,我需要一些更复杂的东西。我的第一个猜测是设计一个带有可设置布尔标志的智能指针,指示智能指针是否拥有该对象。然后,不是采用指向Filter
对象的指针集合,而是采用指向对象FilterChain
的智能指针Filter
集合。当FilterChain
' 的析构函数被调用时,它会破坏智能指针。当且仅当设置了指示所有权的布尔标志时,智能指针本身的析构函数将销毁指向的对象(Filter
对象) 。
我觉得这个问题在 C++ 中很常见,但是我在网上搜索流行的解决方案或聪明的设计模式并不是很成功。确实,auto_ptr
在这里并没有真正的帮助,而且shared_ptr
似乎有点矫枉过正。那么,我的解决方案是个好主意吗?