上次客户端完成后如何删除持久对象的实例

时间:2016-03-11 12:40:21

标签: c++ c++11 smart-pointers object-persistence

我正在尝试在C ++中实现对象持久性模型。我们的想法是,有一个Database对象充当各种PersistentObject的工厂,每个PersistentObject都与数据库表中的一行相关联。数据库有这样的方法:

PersistentObject *Database::GetObject(int ID);

返回指向提供了ID号的对象的指针(如果ID不存在,则返回空指针)。在Database类中,还有一个已创建的所有PersistentObject的映射:

std::map<int, PersistentObject*> _objectMap;

在内部,GetObject执行以下两项操作之一:

  1. 如果这是第一次请求带有ID的PersistentObject,那么它会查询数据库,根据结果构造一个新的PersistentObject实例,将该对象地址插入到地图中(ID为键)并返回指向新对象的指针。

  2. 如果先前已加载PersistentObject(即ID已作为映射中的键存在),则它只返回指向该对象的指针。

  3. 集中跟踪PersistentObjects的原因是我有另一个线程不断轮询数据库以获取对加载的PersistentObjects的更改,并将事件发送到任何过期的对象。

    我希望能够做的是垃圾收集数据库中的中心对象映射,这样当客户端代码中没有对特定对象的剩余引用时,该对象将从地图中删除并删除,并且不再由更新监视线程检查。

    我想用shared_ptr这样做,但问题是如果我在地图中使用shared_ptr,那么即使对象不再使用,引用计数也永远不会变为零。我无法在地图中保留传统指向PersistentObject的指针,并从中创建多个shared_ptrs。

    有人知道这样做的方法吗?我几乎需要一个shared_ptr,它会在引用计数达到1而不是0时调用删除器。或者有更好的方法来实现我想要做的事情吗?

1 个答案:

答案 0 :(得分:2)

最好的方法是将shared_ptr返回给客户,但要在地图中存储weak_ptrweak_ptr不会增加引用计数,并且可以使用shared_ptr轻松生成更多lock()。你必须看到你的对象过期,除了你实现一个自定义删除器,清除&#34;死&#34;参考