具有自动清除功能的中央注册表中对象的句柄
Handles to objects in central registry with automated cleanup
我有一个中央对象存储库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
s,但仅在内部存储weak_ptr
s。更新循环可以检查弱指针是否仍然有效,如果无效则删除它。
您的最后一个要求,即删除基础也将杀死现有对象,是有点棘手的。您可以遍历Base
的析构函数中的弱指针,并向所有活动对象发送自毁信号,但这不会阻止现有的共享指针。
设h1
、h2
、h0
的类型为TYPE*
class Base {
// ...
map<TYPE*, int> t_HandleMap;
public:
TYPE* MakeFoo ()
{
TYPE* p = new TYPE;
t_HandleMap[p] = 0;
return p;
}
static void Delete (Base *&pB, TYPE *pH)
{
t_HandleMap.erase(pH);
if(t_Handlemap.empty())
{
delete pB; pB = 0;
}
}
~Base ()
{
for(<iterate through map>)
delete <pHandle>;
t_HandleMap.clear();
}
};
以上是伪代码,只是给想法。如果它有效,你可以加强它。我所做的唯一的改变就是把Delete
变成了static
。所以现在我们不用
b->Delete(h1);
你必须打电话
Delete(b, h1);
这没有考虑h2
的情况。如果您对这种方法满意,那么我们可以尝试添加一些逻辑。
必须有人拥有这些对象。无论谁拥有它,都应该持有一个shared_ptr。每个人都应该有一个weak_ptr。如果不清楚谁拥有这个对象,就创建一个服务,并且只让服务拥有这个对象。
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 返回对象的实例并通过句柄使用它
- c++使用字符串句柄对对象进行通用存储和检索
- 我们可以从设备句柄中获取设备对象详细信息 /名称吗?
- 如何确定两个Win32 API句柄表示相同的对象
- 访问指针句柄中对象的地址
- 如何在运行时获取许多对象之一的句柄
- 从套接字对象获取fd或句柄
- ofstream-需要在close()操作后删除对象句柄
- 在哈希容器中存储持久的v8对象句柄
- 具有自动清除功能的中央注册表中对象的句柄
- 线程是否需要获得互斥对象的所有权才能关闭互斥对象的句柄
- 异构容器和句柄对象