感慨:不深入阅读源代码,真的心虚,也用不好。
上代码:
class A01 {
public:
//std::weak_ptr<B0> b_ptr;
int data{ 1234 };
~A01() {
std::cout << "A01 deleted\n";
}
void Print() { std::cout << "I'm A01\n"; }
};
void funxx11(std::shared_ptr<A01> ptr)
{
printf("count = %ld\n", ptr.use_count()); //ptr:3, ctrl_block:3
ptr.reset(); //ptr:0, ctrl_block:2
printf("count = %ld\n", ptr.use_count()); //ptr:0, ctrl_block:2
}
void funxx22(std::shared_ptr<A01> ptr)
{
printf("count = %ld\n", ptr.use_count()); //ptr:2, ctrl_block:2
funxx11(ptr);
printf("count = %ld\n", ptr.use_count()); //ptr:2, ctrl_block:2
}
auto main444() -> int
{
std::shared_ptr<A01> ptr = std::make_shared<A01>(); //ptr:1, ctrl_block:1
funxx22(ptr);
return 1;
} //shared_ptr析构,释放资源
int main()
{
main444();
return 1;
}
shared_ptr::reset()源码解析:
D:\DevTools\VS2017\VC\Tools\MSVC\14.16.27023\include\memory
void reset() noexcept
{ // release resource and convert to empty shared_ptr object
shared_ptr().swap(*this);
此处用一个shared_ptr的临时对象和当前的指针内容进行交换。交换的过程就是交换指针,并不会对计数进行增减。
交换完之后,当前的shared_ptr变成了NULL,而临时对象指向计数为3的控制块。这行代码执行完之后,临时shared_ptr当即析构,析构的时候,将计数减为了2.
}
刚进函数的时候,计数为:ptr:3, ctrl_block:3,见下面图片里的第一条:
当执行完swap之后,见下面图片里的第二条:
怎么说呢,对于ptr在函数退出时把计数器减1,这个reset操作相当于提前进行了减1操作