gpt4 book ai didi

c++ - 智能指针( boost )解释

转载 作者:IT老高 更新时间:2023-10-28 11:26:43 25 4
gpt4 key购买 nike

下面这组指针有什么区别?你什么时候在生产代码中使用每个指针,如果有的话?

示例将不胜感激!

  • scoped_ptr
  • shared_ptr
  • weak_ptr
  • intrusive_ptr

  • 你在生产代码中使用 boost 吗?

    最佳答案

    智能指针的基本属性

    当您拥有可以分配每个智能指针的属性时,这很容易。有三个重要的属性。

  • 根本没有所有权
  • 所有权转让
  • 所有权份额

  • 第一个意思是智能指针不能删除对象,因为它不拥有它。第二种意味着只有一个智能指针可以同时指向同一个对象。例如,如果要从函数返回智能指针,则所有权将转移到返回的智能指针。

    第三个意思是多个智能指针可以同时指向同一个对象。这也适用于原始指针,但是原始指针缺少一个重要的特性:它们没有定义它们是否拥有。如果每个所有者都放弃该对象,则所有权共享智能指针将删除该对象。这种行为恰好经常需要,因此共享拥有智能指针被广泛传播。

    一些拥有智能指针既不支持第二个也不支持第三个。因此它们不能从函数返回或传递到其他地方。哪个最适合 RAII目的是将智能指针保留在本地并刚刚创建,以便在超出范围后释放对象。

    所有权共享可以通过复制构造函数来实现。这自然会复制一个智能指针,并且拷贝和原始指针都将引用同一个对象。所有权的转移目前无法在 C++ 中真正实现,因为没有办法将某些东西从一个对象转移到该语言支持的另一个对象:如果您尝试从函数返回一个对象,则发生的情况是该对象被复制。因此,实现所有权转移的智能指针必须使用复制构造函数来实现所有权转移。然而,这反过来又破坏了它在容器中的使用,因为需求声明了容器元素的复制构造函数的某些行为,这与这些智能指针的这种所谓的“移动构造函数”行为不兼容。

    C++1x 通过引入所谓的“移动构造函数”和“移动赋值运算符”为所有权转移提供了 native 支持。它还带有这样一个名为 unique_ptr的所有权转让智能指针。 .

    分类智能指针
    scoped_ptr是一个既不可转让也不可共享的智能指针。如果您需要在本地分配内存,则它仅可用,但请确保在超出范围时再次释放它。但如果您愿意,它仍然可以与另一个 scoped_ptr 交换。
    shared_ptr是一个共享所有权的智能指针(上面的第三种)。它是引用计数的,因此它可以看到它的最后一个拷贝何时超出范围,然后释放所管理的对象。
    weak_ptr是一个非拥有的智能指针。它用于在不添加引用计数的情况下引用托管对象(由 shared_ptr 管理)。通常,您需要从 shared_ptr 中获取原始指针并将其复制。但这并不安全,因为您无法检查对象何时被实际删除。因此,weak_ptr 通过引用由 shared_ptr 管理的对象来提供方法。如果您需要访问该对象,您可以锁定它的管理(以避免在另一个线程中使用该对象时 shared_ptr 释放它)然后使用它。如果weak_ptr 指向一个已经被删除的对象,它会通过抛出异常来通知你。当你有一个循环引用时,使用 weak_ptr 是最有益的:引用计数不能轻易应对这种情况。
    intrusive_ptr就像一个 shared_ptr 但它不会将引用计数保留在 shared_ptr 中,而是将计数的递增/递减留给一些需要由管理的对象定义的辅助函数。这样做的好处是可以将已经被引用的对象(其引用计数由外部引用计数机制递增)填充到 intrusive_ptr 中 - 因为引用计数不再是智能指针的内部,但智能指针使用现有的引用计数机制。
    unique_ptr是所有权的转移指针。你不能复制它,但你可以使用 C++1x 的移动构造函数移动它:
    unique_ptr<type> p(new type);
    unique_ptr<type> q(p); // not legal!
    unique_ptr<type> r(move(p)); // legal. p is now empty, but r owns the object
    unique_ptr<type> s(function_returning_a_unique_ptr()); // legal!

    这是 std::auto_ptr 遵循的语义,但由于缺少对移动的原生支持,它无法毫无缺陷地提供它们。 unique_ptr 将自动从临时的其他 unique_ptr 中窃取资源,这是移动语义的关键特征之一。 auto_ptr 将在下一个 C++ 标准版本中被弃用,以支持 unique_ptr。 C++1x 还允许填充只能移动但不能复制到容器中的对象。因此,您可以将 unique_ptr 填充到 vector 中。到此为止,请引用 a fine article如果你想阅读更多关于这个。

    关于c++ - 智能指针( boost )解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/569775/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com