2015-12-02 88 views
10

看来,weak_ptr不知何故只知道它的引用shared_ptr何时被销毁。那个怎么样?是否有一个不断的链接保持或什么?当其shared_ptr被销毁时,weak_ptr会发生什么?

采取following code for example

weak_ptr<int> test() { 
    shared_ptr<int> foo{new int}; 

    return foo; 
} 

int main() { 
    auto foo = test(); 

    cout << foo.expired() << endl; 
} 

我本来期望段错误时weak_ptr<int>去检查的shared_ptr<int>的状态,但没有一个。 weak_ptr<int>正确地将内存标识为已解除分配。它如何知道?

+0

“的std :: weak_ptr的”保存到共享的引用引用的计数方式与'std :: shared_ptr'相同。唯一不同的是'std :: weak_ptr'不增加/减少这个计数。 –

+3

*我预料会出现段错误... *为什么?这就是weak_ptr – UmNyobe

+0

@UmNyobe的重点!我想我正在试图沟通,我不明白它是如何工作的。 –

回答

12

std::shared_ptr使用两个存储器创建的:

  • 资源块:它包含指针实际的基础数据,例如'int *'

  • 控制块:它保存特定于shared_ptr的信息,例如引用计数。

(有时这些在存储器效率的单个块分配,见std::make_shared

控制块存储基准计数weak_ptr。直到最后一个weak_ptr超出范围(弱指针引用计数下降到零)才会释放它。

所以一个weak_ptr会知道它过期,因为它可以访问这个控制块,它可以检查引用计数是什么一个shared_ptr

+0

我在这里有一个误解。所以你说**控制块**实际存储2个计数? “weak_ptr”的数量和“shared_ptr”的数量?直到BOTH为0,它才被销毁? –

+2

@JonathanMee:这是正确的。 – AndyG

+2

@JonathanMee:是的,从概念上讲就是这样发生的事情。顺便说一下,您可以打开标准库头文件并亲自查看实现情况! –

相关问题