我在我的代码中大量使用了 boost::scoped_ptr,它很棒,但我目前正在使用到处使用 shared_ptr 的软件,我想知道我是否遗漏了一些东西。
AFAIK shared_ptr 仅在不同的线程要访问相同的数据并且您不知道线程将要完成的顺序时才有用(shared_ptr 确保对象存在直到最后一个线程完成它)。
还有其他用例吗?
我在我的代码中大量使用了 boost::scoped_ptr,它很棒,但我目前正在使用到处使用 shared_ptr 的软件,我想知道我是否遗漏了一些东西。
AFAIK shared_ptr 仅在不同的线程要访问相同的数据并且您不知道线程将要完成的顺序时才有用(shared_ptr 确保对象存在直到最后一个线程完成它)。
还有其他用例吗?
AFAIK shared_ptr 只有在不同的线程要访问相同的数据时才有用
好吧,它适用于多个所有者拥有智能指针指向的同一个对象的情况。他们可以从不同的线程访问智能指针,并且shared_ptr也可以在该区域使用,但这不是重点。如果最后一个所有者丢失了对所指向对象的引用,shared_ptr 机制将删除该对象。
如果您想要的只是一个指针,当它创建的范围离开时(通过异常,通过转到外部位置,或通过正常控制流或其他机制),您可以使用scoped_ptr 。如果你这样使用它,则无需更改为 shared_ptr。
线程在这里无关紧要。相关的是是否容易指定对象不再使用的点。
假设几个不同的对象想要使用同一个对象。它可能是一组数据,或者用于输入/输出,或者一些几何对象,或者其他什么。您希望在删除所有使用对象后删除共享对象,而不是之前的一个时钟周期。您可以使用 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 不会让对象被破坏,直到对它的所有引用都被释放。