我有一个用于创建链接对象集的类。 “链接”以指针 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/