shared_ptr<int> myfunc(shared_ptr<int> &ptmp) {
return ptmp;//ptmp = shared_ptr 100 [3 strong refs] [make_shared]如果没有用引用,是显示3个强引用计数
//ptmp = shared_ptr 100 [2 strong refs] [make_shared]如果用了引用,是2个计数,不会增加,如果值传递会创建临时对象
}
auto p1 = make_shared<int>(100);//返回一个智能指针
auto p2 = (p1);p1 p2都指向了相同的内存,此内存有两个引用者
//myfunc(p2);//返回之后p2 = shared_ptr 100 [2 strong refs] [make_shared]
/返回之后的强引用计数变为2
auto p3 = myfunc(p2);//如果用auto p3变量来接收myfunc(p2)返回值
//p3 = shared_ptr 100 [3 strong refs] [make_shared]一样可以产生计数
p3 = make_shared<int>();//重新定义之后,p3为计数1了,p2和p1又回到2个强引用计数中了
性能分析:make_shared();在没有用到自定义删除器时,优先使用。
shared_ptr (new int(111));
会创建两次,在New int时,生成一个裸指针额,在shared_ptr时,生成智能指针。
shared_ptr智能指针内部会有指向该对象内存的指针,也会有一个指向其控制块的智能指针。包含了,自定义的删除器,内存分配器等。
智能指针是8字节,是裸指针的两倍。
最后:永远不要用get得到的指针来初始化另外一个智能指针,或者给另外一个智能指针赋值。会造成不可预料的后果。