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