原生指针和弱指针有什么区别?

42

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


7
你可以检查 weak_ptr 是否指向有效的对象,但是使用裸指针无法实现这一点。 - juanchopanza
2
最好你自己去这里看一下,然后了解所有的区别。没有一个单一的区别,而是有很多。 - juanchopanza
2个回答

33

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

23

原始指针通常只是一个地址,你无法从指针本身了解它所指向的内容。

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

shared_ptr 是具有引用计数功能的,因此它会跟踪到当前对象存在多少个引用(指针),并在没有指向该对象的引用时自动销毁对象。

如前所述,weak_ptrshared_ptr 相关联。与 shared_ptr 不同的是,weak_ptr 的存在不会增加指向对象的引用计数。要使用 weak_ptr,您必须首先将其转换为 shared_ptr。如果当前引用计数为正,则转换成功,并且转换 weak_ptrshared_ptr 将增加引用计数以表明已经将转换指针作为实际对象的引用。如果引用计数已经为零(表示指向对象的指针已被销毁),则尝试将 weak_ptr 转换为 shared_ptr 将简单失败。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接