0

首先,我的实际问题

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

背景如下:

出于怀旧,我一直在使用 MySQL 后端用 C++ 编写 MUD 引擎。我现在正处于持久实体的阶段(在这种情况下,例如帐户、角色等)。我在找出实现这一点的最佳方法时遇到了一些麻烦,因此决定寻求一些建议。

我目前的持久化架构是这样的,以字符为例

字符实体 -> 字符存储 -> 字符持久化 -> MySQL

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

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

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

4

1 回答 1

0

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

我创建了一个 entity_ptr_provider 接口,它定义了方法获取(uuid)和释放(uuid)。entity_ptr 采用实体类型(帐户、角色等)的模板化参数、该类型的实体和 entity_ptr_provider。

在 entity_ptr 类型的构造或复制时,它使用实体的 UUID 调用 entity_ptr_provider 上的获取,以便它可以增加对它的引用,当它被解构时,它调用 release 允许 entity_ptr_provider 减少引用。当引用达到 0 时,它会从表中释放。

于 2014-02-06T13:16:24.173 回答