繁体   English   中英

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

[英]What's the difference between raw pointer and weak_ptr?

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

裸指针和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

原始指针(至少通常)只是一个地址。 你不能告诉它指向指针本身什么。

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表示对pointee对象的非拥有访问。 如果对象存在,它允许访问。 如果对象已被销毁,它会告诉您指针对象不再存在,而不是尝试访问被销毁的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM