c++ - 从指向的对象本身有效地释放指针

标签 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) , 和 data_充满了const shared_ptr<T>& data .方法add()添加 Myclass 的对象到一个集合,通过将它链接到集合的头部。 “链接”实际上是由 rep() 完成的,正如您在代码中看到的那样。该类的任何公共(public)函数都通过 rep() 完成它的工作。 ,如 data() .因此,我可以访问 data_来自集合中的任何对象。

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

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

我想到的唯一想法是在类中创建另一个变量,一个指针 vector Myclass<T>* .每次将一个对象添加到集合中时,head 的 vector 都会随着指向这个全新对象的指针而增加。所以,当我想“解散”一个集合时,我只需要通过这些指针来修复变量 link每个对象的 0x00 .但是,我很确定这一定是其他更优雅和优化的方式。

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

最佳答案

如果我完全理解您的问题,您应该能够使用智能指针(如 C++11 的 shared_ptr 和相关类)最安全、最简单地完成此操作。

关于c++ - 从指向的对象本身有效地释放指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16832225/

相关文章:

c - 这个指针如何同时为空和不为空?

c - 使用指向 int 的指针声明字符串

将 'qualify' 列值 'yes' 和 'no' 替换为 True 和 False 的 Python 程序

tfs - 标准分行计划中的服务分行

javascript - 内部像 lodash 中的合并

c++ - 递归算法将所有组合分为两组

c++函数返回 vector 中的最小正整数

c++ - 使用 CStdioFile 写入字符串

c++ - vector 指针和 push_back()

c++ - 当我在 on_read 上看到错误时,我应该清理 bread::flat_buffer 吗?