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