所以,我使用boost :: shared_ptr来提供它提供的所有各种引用计数好处 - 显然是对启动器的引用计数,还有复制,分配和存储在STL容器中的能力。
问题是,如果我将它传递给一个“恶意”函数或对象,该对象可以保存ptr然后如果没有外部函数或对象很好地放弃其所有权,我将永远无法解除分配它。
最终,我尝试将对象所有权保持明确。我通过让所有者将唯一的shared_ptr保留到对象来完成此操作,而“guest”对象仅将weak_ptrs存储到对象。
我真的不想要shared_ptr的“共享”部分,但我需要使用shared_ptr才能生成weak_ptrs。我想使用scoped_ptr,但它非常有限,因为你无法复制它。您无法将其存储在容器中,也无法从中借出weak_ptrs,也无法将所有权转移给新经理。
解决方案是什么?
答案 0 :(得分:10)
将其设为私有,并提供外观以执行所需的任何操作。没有人见过指针。我想那时你甚至不需要shared_ptr。
答案 1 :(得分:4)
不要传递boost :: shared_ptr对象...即使你在内部使用boost :: shared_ptr存储对象,你应该确保函数通过常量引用而不是副本来获取对象共享指针。由于您需要取消引用共享指针以便将对象传递给通过const引用传递的函数,您将知道它是否遵循该协议。
答案 2 :(得分:1)
如您所述,将weak_ptr用于guest对象就足够了。否则你会遇到死指针的问题。
我会考虑执行应用程序重新架构以删除“恶意”函数/对象或至少修复它们的行为。
答案 3 :(得分:0)
您可以扩展shared_ptr boost类并覆盖delete以强制删除指针。
问题实际上是,如果库没有释放或释放shared_ptr,那么它可能会在某个时候引用它。此时您的应用程序将使用SIGSEGV。
我认为它完全无效了共享指针的目的。
最佳解决方案是修复库。
其他解决方案,使用AOP删除正在调用的库函数退出时的指针。这仍有可能破裂。
答案 4 :(得分:0)
对于你所描述的内容,确实没有好的解决方案。
您无法使用auto_ptr,因为您没有转让所有权。
如果您可以保证所有者超过引用,我建议在所有者中按值使用scoped_ptr / store,然后将原始指针或引用传递给需要它的那些。
如果引用可以比所有者活动(并且需要优雅地通知引用),则必须使用shared_ptr / weak_ptr。但是,正如您所说,您无法阻止任何类/函数锁定weak_ptr和“防止”释放。但是,在接口中,不要传递shared_ptr,传递weak_ptr。它只有像传统一样强大,但它说“不要坚持这个,它可能会消失”。
答案 5 :(得分:0)
如果你想在那个拥有者/拥有范例中处理你的对象,我建议做像Qt这样的事情。
setOwner(Object * owner)
方法设置所有者,并使该方法确保向所有者对象通知新子项。 需要注意的事项: