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

NPS*_*NPS 26 c++ weak-ptr raw-pointer

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

Nic*_*las 24

裸指针与a之间的基本概念差异在于weak_ptr,如果指向的对象被破坏,裸指针将不会告诉您它.这称为悬空指针:指向不存在的对象的指针.他们通常很难追查.

weak_ptr意志.要使用a 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();
}
Run Code Online (Sandbox Code Playgroud)

产量

42
wp is expired
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 19

原始指针(至少通常)只是一个地址.你不能告诉它指向任何东西从指针本身.

A weak_ptr总是与a相关联shared_ptr,所以我们可能需要从a开始shared_ptr才能理解a weak_ptr.

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

正如我已经说过的,a weak_ptr与a相关联shared_ptr.不同于shared_ptr,的存在weak_ptr没有增量而指向对象的引用计数.要使用a weak_ptr,必须先将其转换为shared_ptr.如果当前引用计数为正,那将成功,并且将转换weak_ptr为a shared_ptr将增加引用计数以表示转换后的指针是对象的"实际"引用.另一方面,如果引用计数已经为零(意味着指针对象已被破坏),则将转换weak_ptr为a 的尝试shared_ptr将失败.

A shared_ptr表示指向对象的共享所有权.只要对象的至少一个shared_ptr存在,指针对象将保持存在,但是一旦shared_ptr对象的最后一个被销毁,指针对象也将被销毁.

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