在此记录当函数形参为shared_ptr时,引用和非引用的方式传值,结果的差异
// shared_ptr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "boost/shared_ptr.hpp"
#include <iostream>
#include <assert.h>
class CShared
{
public:
CShared(boost::shared_ptr<int> _p):m_ptr(_p){}
void print_info()
{
std::cout<<"count:"<<m_ptr.use_count()
<<",v = "<<*m_ptr<<std::endl;
}
private:
boost::shared_ptr<int> m_ptr;
};
//教材中的方法,采用copy形式,所以会加1,跳出函数后减1;
void print_func2(boost::shared_ptr<int> _p)
{
std::cout<<"count:"<<_p.use_count()
<<",v = "<<*_p<<std::endl;
}
//修改的方法,采用引用形式,所以不会加1,跳出函数也不会减1;
void print_func(boost::shared_ptr<int>& _p)
{
std::cout<<"count:"<<_p.use_count()
<<",v = "<<*_p<<std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
//boost::shared_ptr<int> shp(new int(10));
//std::cout<<"ref num :"<<shp.use_count()<<std::endl;
//boost::shared_ptr<int> shp2 = shp;
//std::cout<<"ref num :"<<shp.use_count()<<std::endl;
//std::cout<<"sp1:"<<*shp<<",sp2:"<<*shp2<<std::endl;
///*shp2.reset();*/
//*shp2 = 100;
//std::cout<<"ref num :"<<shp.use_count()<<std::endl;
//std::cout<<"sp1:"<<*shp<<",sp2:"<<*shp2<<std::endl;
//shp2.reset();
//std::cout<<"ref num :"<<shp.use_count()<<std::endl;
//class test
boost::shared_ptr<int> bsp(new int(10));
print_func(bsp);
CShared csp1(bsp);
csp1.print_info();
CShared csp2(bsp);
csp2.print_info();
*bsp = 20;
print_func(bsp);
getchar();
return 0;
}
结果:
count:1,v=10 //采用非引用时count:2
count:2,v=10
count:3,v=10
count:3,v=10 //采用非引用时count:4