我有一个对象的中央存储库 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/