如何防止任何人窃取我的shared_ptr?

时间:2010-04-22 02:21:52

标签: c++ boost shared-ptr ownership

所以,我使用boost :: shared_ptr来提供它提供的所有各种引用计数好处 - 显然是对启动器的引用计数,还有复制,分配和存储在STL容器中的能力。

问题是,如果我将它传递给一个“恶意”函数或对象,该对象可以保存ptr然后如果没有外部函数或对象很好地放弃其所有权,我将永远无法解除分配它。

最终,我尝试将对象所有权保持明确。我通过让所有者将唯一的shared_ptr保留到对象来完成此操作,而“guest”对象仅将weak_ptrs存储到对象。

我真的不想要shared_ptr的“共享”部分,但我需要使用shared_ptr才能生成weak_ptrs。我想使用scoped_ptr,但它非常有限,因为你无法复制它。您无法将其存储在容器中,也无法从中借出weak_ptrs,也无法将所有权转移给新经理。

解决方案是什么?

6 个答案:

答案 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这样的事情。

  1. 创建一个基类Object,系统中的所有类都将继承该对象。每个对象都跟踪其父/所有者和子项。
  2. 使用setOwner(Object * owner)方法设置所有者,并使该方法确保向所有者对象通知新子项。
  3. Object的析构函数应该在销毁时删除所有子对象。
  4. 定义一个模板类,该类定义指向Object子类的智能指针。使它成为对象通知任何连接的智能指针有关其销毁的信息,以便在销毁对象时该值将变为NULL。
  5. 需要注意的事项:

    1. 必须通过new为Objects析构函数分配所有对象才能正确释放它们。
    2. 如果您忘记为对象设置父级,则会泄漏
    3. 处理不从Object继承的对象很棘手,尽管可以通过定义一个继承自Object的模板类来保存它们。