I have written following simple code,
#include <iostream>
#include <memory>
struct Foo
{
    Foo()      { std::cout << "Foo::Foo\n";  }
    ~Foo()     { std::cout << "Foo::~Foo\n"; }
    void bar() { std::cout << "Foo::bar\n";  }
};
int main()
{
    std::shared_ptr<Foo> p1(new Foo);//this line
    p1->bar();
    std::shared_ptr<Foo> p2(p1);
}
And in watch window I got,
p2  std::__1::shared_ptr<Foo>   ptr = 0x100104350 strong=2 weak=1   
p1  std::__1::shared_ptr<Foo>   ptr = 0x100104350 strong=2 weak=1   
Now, I can understand strong=2, but why weak = 1?
Secondly, in code I changed code to,
std::shared_ptr<Foo> p1(std::move(new Foo));
Because, may be one weak pointer is because of nameless object. So I have moved it while creating p1, still I get same output in watch window.
Please suggest which point I am missing?
The value shown for weak is not the number of weak_ptr objects that exist, it is the "weak count".
The typical shared_ptr implementation (originating in Boost) stores two counts in the control block, a strong count, S, which is the number of active shared_ptr objects and a weak count, W, which is the number of active weak_ptr objects + (S != 0)
So if there are any shared_ptr objects then W will always be non-zero.
The reason for this is that the implementation destroys the owned object when S == 0 and destroys the control block when W == 0
Since you don't want to destroy the control block while there are shared_ptr objects using it, W must not reach 0 while there are active shared_ptr objects.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With