【问题标题】:What's the difference between raw pointer and weak_ptr?原始指针和weak_ptr有什么区别?
【发布时间】:2013-05-21 13:15:11
【问题描述】:

如标题。这个问题可能已经有了答案,但我没有找到答案。

【问题讨论】:

  • 你可以检查一个weak_ptr是否指向有效的东西。你不能用原始指针来做到这一点。
  • 如果您查看here 并亲自查看所有差异可能会更好。没有一个区别,有很多。

标签: c++ weak-ptr raw-pointer


【解决方案1】:

裸指针和weak_ptr 之间的基本概念区别在于,如果指向的对象被销毁,裸指针不会告诉你。这称为悬空指针:指向不存在的对象的指针。它们通常很难追踪。

weak_ptr 将。要使用weak_ptr,您必须先将其转换为shared_ptr。如果那个shared_ptr 没有指向任何东西,那么这个对象就被删除了。

例如:

#include <iostream>
#include <memory>

std::weak_ptr<int> wp;

void test()
{
    auto spt = wp.lock(); // Has to be copied into a shared_ptr before usage
    if (spt) {
        std::cout << *spt << "\n";
    } else {
        std::cout << "wp is expired\n";
    }
}

int main()
{
    {
        auto sp = std::make_shared<int>(42);
        wp = sp;
        test();
    }
    test();
}

输出

42
wp is expired

【讨论】:

    【解决方案2】:

    原始指针(至少通常)只是一个地址。你无法从指针本身告诉任何关于它在 at 处所指向的内容。

    weak_ptr 始终与shared_ptr 相关联,因此我们可能需要从shared_ptr 开始才能理解weak_ptr

    shared_ptr 是引用计数的,因此它会跟踪存在多少对对象的引用(指针),并在不再存在对该对象的引用时自动销毁该对象。

    正如我已经说过的,weak_ptrshared_ptr 相关联。与shared_ptr 不同,weak_ptr 的存在不会增加指针对象的引用计数。要使用weak_ptr,您必须先将其转换为shared_ptr。如果当前引用计数是正数,那将成功,并且weak_ptr 转换为shared_ptr 将增加引用计数以表示转换后的指针是对对象的“真实”引用.另一方面,如果引用计数已经为零(意味着指针对象已被销毁),则将 weak_ptr 转换为 shared_ptr 的尝试将失败。

    shared_ptr 表示指针对象的共享所有权。只要该对象的至少一个 shared_ptr 存在,pointee 对象就会一直存在,但是一旦该对象的最后一个 shared_ptr 被销毁,pointee 对象也将被销毁。

    weak_ptr 表示对指针对象的非拥有访问。如果对象存在,它允许访问。如果对象已被销毁,它会告诉您指针对象不再存在,而不是尝试访问被销毁的对象。

    【讨论】:

      猜你喜欢
      • 2019-09-04
      • 2018-06-01
      • 2013-10-09
      • 2011-04-04
      • 2010-12-17
      • 2013-07-12
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多