38

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

4

2 回答 2

30

裸指针和 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();
}

输出

42
wp is expired
于 2013-05-26T15:44:10.680 回答
22

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

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

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

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

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

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

于 2013-05-26T15:34:09.593 回答