【发布时间】:2008-12-05 14:49:10
【问题描述】:
我在我的代码中大量使用了 boost::scoped_ptr,它很棒,但我目前正在使用到处使用 shared_ptr 的软件,我想知道我是否遗漏了什么。
AFAIK shared_ptr 仅在不同的线程将要访问相同的数据并且您不知道线程将要完成的顺序时才有用(shared_ptr 确保对象存在直到最后一个线程完成)它)。
还有其他用例吗?
【问题讨论】:
标签: c++ boost shared-ptr raii
我在我的代码中大量使用了 boost::scoped_ptr,它很棒,但我目前正在使用到处使用 shared_ptr 的软件,我想知道我是否遗漏了什么。
AFAIK shared_ptr 仅在不同的线程将要访问相同的数据并且您不知道线程将要完成的顺序时才有用(shared_ptr 确保对象存在直到最后一个线程完成)它)。
还有其他用例吗?
【问题讨论】:
标签: c++ boost shared-ptr raii
线程在这里无关紧要。相关的是指定对象不再使用的点是否容易。
假设几个不同的对象想要使用同一个对象。它可能是一组数据,或者用于输入/输出,或者一些几何对象,或者其他什么。您希望在删除所有使用对象后删除共享对象,而不是之前的一个时钟周期。您可以使用 shared_ptr 来强制执行此行为,而不是弄清楚哪个拥有对象将具有最长的生命周期(如果您更改程序,或者可能通过用户交互,这可能会改变)。
使用对象是在同一个还是不同的线程中都没有关系。即使对象都在同一个线程中,它们也可能具有不可预测的生命周期。
【讨论】:
AFAIK shared_ptr 仅在以下情况下才有用 不同的线程将是 访问相同的数据
嗯,它适用于多个所有者拥有智能指针指向的同一个对象的情况。他们可以从不同的线程访问智能指针,shared_ptr 也可以在那个区域使用,但这不是重点。如果最后一个所有者丢失了对所指向对象的引用,shared_ptr 机制将删除该对象。
您可以使用 scoped_ptr 如果您想要的只是一个指针,该指针在离开创建它的范围时被删除(通过异常,通过 goto到外面的地方,或者通过正常的控制流程或其他机制)。这么用的话就不用改shared_ptr了。
【讨论】:
scoped_ptr 和 shared_ptr(以及 auto_ptr)的区别主要在于复制语义。
【讨论】:
shared_ptr 和scoped_ptr 之间的另一个重要区别是只有shared_ptr 与weak_ptr 一起使用。弱指针用于打破共享指针的循环,从而避免内存泄漏,但weak_ptr 的用途不止于此。
共享指针和弱指针可以用来表达拥有和非拥有引用之间的区别。数据的明确所有权导致设计更简洁,因此在可能的情况下,数据对象应通过 shared_ptr 由 一个 其他对象拥有。所有其他对数据对象的长期引用都应该是弱指针,表示它们对数据的非所有权。任何非拥有模块每次访问数据时,都需要将weak_ptr转换为shared_ptr,此时他们可能会发现数据对象不再存在。然而,当非拥有模块访问数据对象时,它们通过瞬态 shared_ptr 持有它,即使拥有对象要释放数据也能确保安全操作。
【讨论】:
正如已经回答的那样,shared_ptr 是关于共享所有权。但是,我认为共享所有权通常是一件坏事(存在例外,例如享元模式),最好确定所有者并将 scoped_ptr 放在那里。
【讨论】:
shared_ptr 是一种执行引用计数的智能指针类型。如果对象只有一个所有者(常见情况),那么 scoped_ptr 是正确的解决方案。如果对象可以在代码的多个部分之间共享,那么 shared_ptr 不会让对象被破坏,直到所有对它的引用都被释放。
【讨论】: