原始指针和weak_ptr有什么区别?

What's the difference between raw pointer and weak_ptr?

本文关键字:什么 区别 ptr 指针 weak 原始      更新时间:2023-10-16

与title相同。这个问题可能已经有了答案,但是我没有找到。

裸指针和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 expiredn";
    }
}
int main()
{
    {
        auto sp = std::make_shared<int>(42);
        wp = sp;
        test();
    }
    test();
}

输出
42
wp is expired

一个原始指针(至少通常)只是一个地址。你无法从指针本身得知指向的位置。

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存在,该指向对象就会保持存在,但是一旦指向该对象的最后一个shared_ptr被销毁,该指向对象也将保持存在。

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