c++ - 通过自动清理处理中央注册表中的对象

标签 c++

我有一个对象的中央存储库 Base,它可以产生各种东西。 Base 必须保留指向所有对象的指针,因为中央更新方法必须遍历 Base 实例创建的所有对象。然而,如果一个对象的最后一个句柄被销毁,就没有必要再保留它了,所以 Base 应该以某种方式得到通知,现在可以删除该对象了。手动删除对象也应该是可能的,这将立即使所有句柄无效。一些代码来澄清:

Base* b = new Base;
auto h0 = b->MakeFoo ();
auto h1 = h0;
b->Delete (h0);
// h1 is invalid here
{
  auto h2 = b->MakeFoo ();
}
// Base::Delete (h2) was called, as the last reference to it died
// shared_ptr/weak_ptr won't work here, as there would be still one
// reference in Base
auto h3 = b->MakeFoo ();
delete b;
// h3 is invalid here, hence shared_ptr is not enough
// weak_ptr would work here

有什么我可以为此采用的即用型产品吗?在这种情况下,性能并不太重要。

最佳答案

这个怎么样:你的类 Base 通过 Make* 函数输出 shared_ptr,但只存储 weak_ptr内部。更新循环可以检查弱指针是否仍然有效,如果无效则将其删除。

删除基础也会杀死现有对象的最终要求有点棘手。您可以遍历 Base 的析构函数中的弱指针并向所有事件对象发送自毁信号,但这不会停止现有的共享指针。

关于c++ - 通过自动清理处理中央注册表中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6763731/

相关文章:

c++ - 在 C++ 中包含 header 时 undefined reference

c++ - 我将如何创建一个函数来确定用户输入是否是 vector 中包含的单词之一

c++ - 我对 Delphi 中的动态虚拟 channel 有点困惑

c++ - 通过标签继承选择最佳可用功能

c++ - 从 C++ 代码调用 C 函数

c++ - std::find 不使用我定义的 == 运算符

c++ - 使用 QDataStream 的 Qt 序列化 bool 值

C++双指针多态性

c++ - 指向同一个数组的多个对象

c++ - 为什么大多数STL算法都需要排序后的数据作为输入?