4

我有一个智能指针列表。我希望其中一些智能指针充当常规指针,这意味着它们只是对实例的引用,不参与其释放。例如,它们可能指向堆栈上分配的实例。列表中的其他智能指针应充当常规 boost::shared_ptr。

这是该类的外观:

template<class T> smart_ptr {
private:
    T *p;
    boost::shared_ptr<T> sp;
public:
    smart_ptr(T *p): p(p), shared(0) { } // p will not be deleted
    smart_ptr(boost::shared_ptr<T> &sp): p(sp.get()), sp(sp) { }
    T *get() const { return p; }
}

如果有一个 boost 类可以做到这一点,我宁愿使用它而不是自己编写一个类。似乎没有,还是我弄错了?

4

4 回答 4

13

一个构造函数shared_ptr采用析构函数方法,您可以传入一个空函子。

在 boost::shared_ptr 中使用自定义释放器

(您只需要一个空函数。)

于 2009-07-20T09:09:47.423 回答
3

我的工具箱中有这个小类:

struct nodelete {
    template <typename T>
    void operator()( T * ) {}
};

用法:

int main() {
    SomeClass sc;
    boost::shared_ptr<SomeClass> p( &sc, nodelete() );
    // ...
}
于 2009-07-20T09:20:38.867 回答
1

这听起来像一个 boost::weak_ptr: http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/weak_ptr.htm

但是您只能从 shared_ptr 创建一个weak_ptr,因此对于您的堆栈分配对象,我不确定它是如何工作的。

于 2009-07-20T09:11:03.100 回答
0

这闻起来很糟糕的设计。

我想不出你不想删除指针的合理情况。以下是(不合理的 IMO)情况:

1) 静态持续时间对象。相反,请考虑使用单例混合(使用 CRTP 来混合具有返回本地静态 shared_ptr<> 副本的 instance() 方法的单例;本地静态是线程不安全的,因此您还需要一个适当的静态互斥锁,如果这可以被多个线程调用)。使用正确的单例的好处是,在其他继续持有 shared_ptr<> 的对象之后,您的单例将在退出时被破坏。

2) 在堆栈上创建的对象。只是不要这样做。而是在由 shared_ptr<> 保护的堆上创建对象。如果您需要在代码的不同部分为对象创建 shared_ptr<>(即您不能从原始 shared_ptr<> 复制)然后从 boost::enable_shared_from_this<> 继承并获取 shared_ptr<>来自 shared_from_this()。

还有其他原因你想要一个永远不会删除任何东西的 shared_ptr<> 吗?

于 2010-03-11T15:37:19.327 回答