首先,我的实际问题
我在地图中有一个共享指针,当除了地图本身中的共享指针之外没有其他引用时,我想从地图中删除该共享指针,以便释放目标。我怎样才能做到这一点?另外,有什么更好的设计来解决我的问题?
下面的背景:
出于怀旧之情,我一直在使用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时,它将从表中释放。