代码之家  ›  专栏  ›  技术社区  ›  Patrick

shared_ptr:它的用途是什么

  •  4
  • Patrick  · 技术社区  · 17 年前

    我在代码中大量使用了boost::scoped_ptr,它很棒,但我目前使用的软件到处都是shared_ptr,我想知道我是否遗漏了什么。

    AFAIK shared_ptr仅在不同线程将访问相同数据并且您不知道线程将以何种顺序完成时才有用(shared_ptr确保对象存在,直到最后一个线程完成它)。

    还有其他用例吗?

    6 回复  |  直到 17 年前
        1
  •  7
  •   Johannes Schaub - litb    17 年前

    线程在这里无关紧要。重要的是,是否很容易指定一个对象不再使用的点。

    假设几个不同的对象想要使用同一个对象。它可能是一组数据,或用于输入/输出,或一些几何对象,或其他任何东西。您希望在删除所有正在使用的对象后删除共享对象,而不是之前的一个时钟周期。与其弄清楚哪个拥有对象的寿命最长(如果你改变程序,或者通过用户交互,这可能会改变),你可以使用shared_ptr来强制这种行为。

    使用对象是在相同的线程中还是在不同的线程中并不重要。即使对象都在同一线程中,它们也可能具有不可预测的生命周期。

        2
  •  7
  •   David Thornley    17 年前

    AFAIK shared_ptr只有在以下情况下才有用 不同的线程将是 访问相同的数据

    嗯,它适用于多种情况 主人 拥有智能指针指向的相同对象。他们可以从不同的线程访问智能指针,以及 shared_ptr 在那个领域也是可用的,但这不是重点。如果最后一个所有者失去了对所指向对象的引用,shared_ptr机制将删除该对象。

    您可以使用 scoped_ptr 如果你只想有一个指针,当创建它的作用域被保留时(无论是由于异常还是由于 转到 或者通过正常的控制流或一些其他机制)。如果你这样使用它,就没有必要更改为shared_ptr。

        3
  •  2
  •   chrish    17 年前

    scoped_ptr和shared_ptr(以及auto_ptr)之间的区别主要是复制语义。

    • scoped_ptr用于“ Resource Allocation Is Initialization “并且不可复制(它不能与其他实例共享,所有权也不能转移)
    • shared_ptr用于在多方共享时自动回收内存
    • auto_ptr是可复制的(并在分配时转移所有权)
        4
  •  2
  •   Rasmus Storjohann    15 年前

    shared_ptr和scoped_ptr之间的另一个重要区别是,只有shared_ptr可以与weak_ptr一起工作。弱指针用于打破共享指针的循环,从而避免内存泄漏,但Weak_ptr的用途不止于此。

    共享指针和弱指针可用于表示拥有引用和非拥有引用之间的区别。明确的数据所有权会导致更清晰的设计,因此在可能的情况下,数据对象应由 一个人 通过shared_ptr访问其他对象。所有其他对数据对象的长期引用都应该是弱指针,表示它们对数据的非所有权。每当任何非拥有模块访问数据时,它们都需要将weak_ptr转换为shared_ptr,此时它们可能会发现数据对象不再存在。然而,当非拥有者模块访问数据对象时,它们通过瞬态shared_ptr持有它,即使拥有者对象释放数据,也能确保安全操作。

        5
  •  1
  •   Nemanja Trifunovic    17 年前

    正如已经回答的那样,shared_ptr是关于共享所有权的。然而,我认为共享所有权通常是一件坏事(也有例外,比如轻量级模式),最好确定一个所有者并在那里放一个scoped_ptr。

        6
  •  1
  •   Greg    17 年前

    shared_ptr是一种执行引用计数的智能指针类型。如果对象只有一个所有者(常见情况),那么scoped_ptr是正确的解决方案。如果对象可以在代码的多个部分之间共享,那么shared_ptr不会让对象被销毁,直到所有对它的引用都被释放。