- 主题:关于要不要用智能指针的纠结
现在有个大型场景模型(cad类的),里边涉及到许多对象,比如点,线,面,体等。这个模型是全局单例。
为了避免内存泄露,现在有两种做法
1 搞一个对象管理器,所有得创建都通过对象管理器,删除也是对象管理器代劳。
2 不用对象管理器,用智能指针,每个对象自己管自己
对象之间还有相互连接和引用。
场景有遍历需求
如果用对象管理器的话,感觉写法有点老土。
用智能指针的话,对象之间的互指免不了要用weakptr,而且遍历的时候麻烦,不好搞,一个简单的统计对象数目都麻烦死。
此外对象之间的互引,无论什么模式都得手动处理。
大家有什么建议和经验可以分享的吗?
--
FROM 114.242.250.*
你这个pool是关键。
没这个pool,这个机制就不行了。你把消息发给谁啊
这个pool中用什么作为actor的索引?
【 在 allegro @ [CPlusPlus] 的大作中提到: 】
:
: 我以前写过一个actor pool,大概是每个actor只接受消息,用一个uint64做邮箱地址。
: 如果要delete一个actor,就给他发个自杀消息。
:
: 然后他首先自己从pool中disable,不再接受任何消息,然后显式delete this。
--
FROM 114.242.250.*
active是什么意思?
那就是对象之间通过id通信是吧?
和我的很像。
【 在 allegro 的大作中提到: 】
:
: 每个actor有唯一的一个uint64的id,这个id是个bitfield。
: 有标志位+序列位,标志位有actor的基本信息,序列位单增保证唯一性。
:
: 应该和你说的instance管理器差不多。不知道你的点线面是不是active的。
--
FROM 114.242.250.*
对象创建和删除都是单线程的, 对每个对象的写操作也是单线程的。
autocad那样的,比如用户创建一条曲线的时候,我就给他创建一个对象。他要删除一个曲线的时候, 我先检查引用情况,条件合适的时候就从object manager中删除.
在对象的写操作上,应该没有多线程的需求。
【 在 here080 的大作中提到: 】
: 你都是全局单例,那当然是对象管理器啦。
: 但你这还有没说清楚的地方。对象的创建和删除一般是什么场景?多线程是怎么协作的?
:
--
FROM 120.244.224.*