一般来说,我遵循谷歌风格指南,我觉得这与我看待事物的方式非常吻合。我也几乎完全使用 boost::scoped_ptr 以便只有一个管理器拥有特定对象的所有权。然后我传递裸指针,我的想法是我的项目的结构使得所述对象的管理器总是在使用它们的对象被销毁后被销毁。
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Smart_Pointers
这一切都很好,但是我只是被一个令人讨厌的小内存踩踏错误咬住了,其中所有者恰好在使用它的对象被删除之前被删除。
现在,在每个人都认为我是这种模式的傻瓜之前,我为什么不直接使用 shared_ptr 呢?等等,考虑一下我不想有未定义的所有者语义这一点。尽管 shared_ptr 会捕捉到这种特殊情况,但它会向系统用户发送错误消息。它说:“我不知道这是谁的,可能是你!”
对我有帮助的是指向作用域指针的弱指针。实际上,一个具有弱引用列表的作用域指针,当作用域指针解构时,这些弱引用被清空。这将允许单一所有权语义,但让使用对象有机会捕捉我遇到的问题。
因此,以一个额外的 'weak_refs' 指针为 scoped_ptr 和一个额外的指针为 'next_weak_ptr' 中的weak_ptr 为代价,它将成为一个简洁的小型单所有者、多用户结构。
它甚至可能只是一个调试功能,因此在“发布”中,整个系统只是变回正常大小的 scoped_ptr 和弱引用的标准单指针。
所以.....毕竟我的问题是:
- stl/boost 中是否已经有这样的指针/模式,我错过了,还是我应该自己滚动?
- 有没有更好的方法,仍然可以满足我的单一所有权目标?
干杯,谢恩