有效地从指向对象本身释放指针



我有一个类,我用它来创建一组链接对象。"链接"是以这样一种方式执行的,即给定集合的每个对象的指针link指向类的一个相同对象(从现在开始将其称为"头")。因此,当访问集合中的一个对象时,它将反过来访问头部,从而访问包含在头部中的data_(一种链表,但其中所有对象都链接到一个对象,而不是链接到列表中的下一个对象)。

类是这样的:

template <typename T> class Myclass;
template <typename T>
class Myclass
{
    Myclass<T>* link;
    shared_ptr<T> data_;
    int count_;
    Myclass<T>* rep()
    {
        if(link==0x00) return this;
        else
        {
            Myclass* ret = link->rep();
            return link = ret;
        }
    }
public:
    Myclass()
    : link(0x00)
    , count_(1)
    {}
    explicit Myclass(const shared_ptr<T>& data)
    : link(0x00)
    , data_(data)
    , count_(1)
    {}
(...more functions)
    void add(Myclass<T>& rv)
    {
        if(*this == rv) return;
        rv.data() = shared_ptr<T>();
        rep()->count_ += rv.empty() ? 1 : rv.count();
        rv.count_ = 0;
        rv.rep()->link = rep();
    }
    shared_ptr<T>& data()
    {
        return rep()->data_;
    }
}

Myclass的对象被构造函数explicit Myclass(const shared_ptr<T>& data)调用时,创建一个"头",data_const shared_ptr<T>& data填充。方法add()通过将Myclass的对象链接到集合的头部,将其添加到集合中。"链接"实际上是由rep()完成的,正如您在代码中看到的那样。类的任何公共函数都通过rep()完成它的工作,就像data()一样。因此,我可以从集合的任何对象访问data_

问题是,当在代码的某个地方处理Myclass集合中的一个对象时,我可能需要分解该集合。对我来说,分解集合意味着该集合的所有对象都不喜欢头部(即,变量link不再指向头部),并且头部的data_被释放(因此它不再是头部)。这里的挫折是,我只能访问我正在处理的对象和头部(通过rep())。

当我只能访问集合中的一个对象时,我如何执行这个分解?

我唯一的想法是在类中创建另一个变量,指针的向量Myclass<T>*。每当一个对象被添加到set中时,头部的向量就会增加一个指向这个新对象的指针。所以,当我想要"溶解"一个集合时,我只需要通过这些指针,将每个对象的变量link固定为0x00。然而,我很确定一定有其他更优雅和优化的方式来做到这一点。

任何想法都会非常受欢迎。希望我已经足够清楚地解释了我的问题

如果我完全理解你的问题,你应该能够用智能指针(如c++ 11的shared_ptr和相关类)最安全,最容易做到这一点。

相关内容

  • 没有找到相关文章

最新更新