首先,我的实际问题

我在地图中有一个共享指针,当除了地图本身中的共享指针之外没有其他引用时,我想从地图中删除该共享指针,以便释放目标。我怎样才能做到这一点?另外,有什么更好的设计来解决我的问题?

下面的背景:

出于怀旧之情,我一直在使用MySQL后端以C ++编写MUD引擎。我现在要保留实体(在这种情况下,诸如帐户,字符等之类的东西)。我在找出实现此目的的最佳方法时遇到了一些麻烦,因此决定寻求一些建议。

我当前的持久性架构看起来像这样,以角色为例

角色实体->角色存储->角色持久性-> MySQL

角色实体是指角色本身,类似于MVC中的模型。它除了数据外什么都没有,只知道其他实体。

字符存储是当前负责将字符实体的实例保存在内存中的容器。当请求通过ID或名称查找字符时,它检查它的内存,实现为包含UUID的std :: string映射到std :: shared_ptr。如果我们已经有一个实例在内存中,那么我们将传递一个共享指针,如果没有,我们将请求持久层,将其存储在映射中,然后将共享指针传递回它。

持久层是抽象的,有一个character_persistence接口,它具有mysql_character_persistence的具体实现,因此我可以轻松地切换到不同形式的持久性。

最佳答案

我使用了引用计数和模板化的entity_ptr类型。

我创建了一个Entity_ptr_provider接口,该接口定义了方法getting(uuid)和release(uuid)。 entity_ptr采用实体类型(帐户,字符等),该类型的实体和entity_ptr_provider的模板化参数。

在entity_ptr类型的构造或副本上,它使用实体的UUID调用entity_ptr_provider上的获得,因此它可以增加对该实体的引用,当其被解构时,它会调用release,该释放允许entity_ptr_provider减少引用。当引用达到0时,它将从表中释放。

09-09 22:09
查看更多