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

时间:2013-05-30 09:17:50

标签: c++ pointers merge linked-list

我有一个类,我用它来创建链接对象集。以这样的方式执行“链接”:给定集合的每个对象的指针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)的对象时,会创建“head”,data_填充const shared_ptr<T>& data。方法add()Myclass的对象添加到集合中,方法是将其链接到集合的头部。 “链接”实际上由rep()完成,您可以在代码中看到。该类的任何公共函数都通过rep()完成其内容,就像在data()中一样。因此,我可以从集合中的任何对象访问data_

问题是,当在代码中某处处理一组Myclass的一个对象时,我可能需要分解该集合。为了打破设置,我认为该组的所有对象都不会从头部开始(即,变量link不再指向头部)并且头部的data_也是释放(所以它不再是头脑)。这里的挫折是我只能访问我正在处理的对象和头部(通过rep())。

当我只能访问该组中的一个对象时,如何进行此分解?

我想出的唯一想法是在类中创建另一个变量,即指针Myclass<T>*的向量。每次将一个对象添加到一个集合中时,头部的向量会增加一个指向这个全新对象的指针。因此,当我想“解散”一个集合时,我只需要通过这些指针将每个对象的变量link修复为0x00。但是,我很确定它必须是其他更优雅和优化的方法。

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

1 个答案:

答案 0 :(得分:1)

如果我完全理解你的问题,你应该能够用智能指针(比如C ++ 11的shared_ptr和相关类)做到最安全和最简单。