【发布时间】:2011-08-17 14:05:38
【问题描述】:
我目前正在研究最流行的智能 Ptr 实现,例如 boost 共享指针和弱指针以及 loki Smart and Strong pointer,因为我想实现自己的并且据我所知 Loki 强指针对我来说看起来不安全,但我宁愿认为我理解错了,所以我想讨论一下它是否安全。我认为它不安全的原因是,据我所知,它没有足够小心地对待弱指针(即 StrongPtr,其中 false 表示其弱):
例如解引用函数:
PointerType operator -> ()
{
KP::OnDereference( GetPointer() ); //this only asserts by default as far as i know
//could be invalidated right here
return GetPointer();
}
在多线程环境中,弱指针可能随时失效,因此该函数可能会返回一个无效的 Ptr。
据我了解,您要么必须创建要取消引用的 ptr 的 strongPtr 实例,以确保它不会在中途失效。我认为这也是 boost 不允许您在不先创建 shared_ptr 实例的情况下取消引用 weak_ptr 的原因。我认为 Lokis StrongPtr 构造函数遇到了同样的问题。
这是一个问题还是我读错了 src?
【问题讨论】:
-
它看起来确实不安全,特别是因为如果不创建强指针,对象不仅可以在您返回它之前被删除,而且在用户使用它时也会被删除(哎哟)。也许是多线程很难的一个很好的例子!
-
好吧,你要指出的是,它不是 thread 安全的。我不知道它是否曾经承诺过是线程安全的(从你展示的 sn-p 来看,它看起来不像)。 (不相关:您的问题标题完全是修辞和自我指涉)
-
我认为你对课堂的要求有点过分。没有锁定,您无法保证您不拥有的东西不会发生邪恶的事情。无论您应该在 operator-> 中添加什么更好的检查以使实际的取消引用完全安全,在您取消引用指针并且仍在成员函数调用中之后,它仍然可能被破坏。就是这样。
-
你的观点当然是正确的,但一方面 loki 强指针带有多线程感知引用计数,这根本无法解决我指出的问题。实际上,我的问题并不是真正的修辞,因为如上所述,我很困惑,一方面它意味着在使用 MT 感知引用计数时是线程安全的,而显然不是。我虽然我错过了一些东西:)
标签: c++ smart-pointers loki