问题1:
#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
shared_ptr<int> ptr = make_shared<int>(100);
printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
map<int, shared_ptr<int>> mp;
mp.insert(pair<int, shared_ptr<int>>(1, ptr));
mp.insert(pair<int, shared_ptr<int>>(2, ptr));
printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
mp.clear();
mp.clear();
printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
return 0;
}
输出:
=100,count=1
=100,count=3
=100,count=1 // 为什么这里引用计数是1而不是0呢?
问题2:
#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
shared_ptr<int> ptr = make_shared<int>(100);
printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
map<int, shared_ptr<int>> mp;
mp.insert(pair<int, shared_ptr<int>>(1, ptr));
mp.insert(pair<int, shared_ptr<int>>(2, ptr));
printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
ptr.reset();
printf("count=%ld\n", ptr.use_count());
return 0;
}
输出:
=100,count=1
=100,count=3
count=0 //这里为什么是0而不是2呢? 一直理解的 reset()是引用计数减1.
问题1:
ptr 还在,还有一个引用。
问题2:
reset 之后,ptr 的指向改变,引用计数已经不是原来指针的引用计数了。新指针是个 nullptr ,引用计数为 0 。原来的指针引用计数是 2 ,两个引用都在 map 里,已经无法通过 ptr 访问。