我正在尝试在C ++中实现对象持久性模型。我们的想法是,有一个Database对象充当各种PersistentObject的工厂,每个PersistentObject都与数据库表中的一行相关联。数据库有这样的方法:
PersistentObject *Database::GetObject(int ID);
返回指向提供了ID号的对象的指针(如果ID不存在,则返回空指针)。在Database类中,还有一个已创建的所有PersistentObject的映射:
std::map<int, PersistentObject*> _objectMap;
在内部,GetObject执行以下两项操作之一:
如果这是第一次请求带有ID的PersistentObject,那么它会查询数据库,根据结果构造一个新的PersistentObject实例,将该对象地址插入到地图中(ID为键)并返回指向新对象的指针。
如果先前已加载PersistentObject(即ID已作为映射中的键存在),则它只返回指向该对象的指针。
集中跟踪PersistentObjects的原因是我有另一个线程不断轮询数据库以获取对加载的PersistentObjects的更改,并将事件发送到任何过期的对象。
我希望能够做的是垃圾收集数据库中的中心对象映射,这样当客户端代码中没有对特定对象的剩余引用时,该对象将从地图中删除并删除,并且不再由更新监视线程检查。
我想用shared_ptr这样做,但问题是如果我在地图中使用shared_ptr,那么即使对象不再使用,引用计数也永远不会变为零。我无法在地图中保留传统指向PersistentObject的指针,并从中创建多个shared_ptrs。
有人知道这样做的方法吗?我几乎需要一个shared_ptr,它会在引用计数达到1而不是0时调用删除器。或者有更好的方法来实现我想要做的事情吗?
答案 0 :(得分:2)
最好的方法是将shared_ptr
返回给客户,但要在地图中存储weak_ptr
。 weak_ptr
不会增加引用计数,并且可以使用shared_ptr
轻松生成更多lock()
。你必须看到你的对象过期,除了你实现一个自定义删除器,清除&#34;死&#34;参考