最近应用开发项目中,使用智能指针比较多,同时也用到了一些开源的第三库,如Fast-DDS,这些软件项目中很多地方用到了智能指针,然而在偶然间看到一个关于智能指针的使用建议,提到”智能指针作为函数形参,定义函数接口时,建议使用值传递,慎用引用转递!!!“,结合看了一些开源代码的实现,并没有满足这个建议进行实现,于是做出了自己的思考,现在编译优化,以及智能指针和引用传递的特点,应该不影响智能指针引用计数的变化,及引用传递时,只是一个别名,使用前后,不改变智能指针的使用计数,从而定义函数接口时,使用值传递和引用传递都不受影响,除非使用者在接口调用前后,或者调用的接口内部,自己强行delete智能指针的空间,或者修改其使用计数。

本人也编码进行验证了,结论是:只要保证智能指针的规范使用,根据应用的业务需求,使用值传递还是引用传递均可,或者const引用传递都可以,何种方式根据自身业务场景进行设计和实现,代码实现和验证结过如下:

static void sharedPtrTest01(const std::shared_ptr<int> &spPtrIn, std::shared_ptr<int> spPtrSend, std::shared_ptr<int>& spPtrOut)
{std::cout << "sharedPtrTest01: " << spPtrIn << "\t" << spPtrIn.use_count() << std::endl;std::cout << "sharedPtrTest01: " << spPtrSend << "\t" << spPtrSend.use_count() << std::endl;std::cout << "sharedPtrTest01: " << spPtrOut << "\t" << spPtrOut.use_count() << std::endl;return;
}void sharedPtrTest()
{std::shared_ptr<int> spPtr1(new int (1));std::shared_ptr<int> spPtr2(new int (2));std::shared_ptr<int> spPtr3(new int (3));std::cout << "------------------------------------" << std::endl;std::cout << "sharedPtrTest: " << spPtr1 << "\t" << spPtr1.use_count() << std::endl;std::cout << "sharedPtrTest: " << spPtr2 << "\t" << spPtr2.use_count() << std::endl;std::cout << "sharedPtrTest: " << spPtr3 << "\t" << spPtr3.use_count() << std::endl;std::cout << "------------------------------------" << std::endl;// 接口调用sharedPtrTest01(spPtr1, spPtr2, spPtr3);std::cout << "------------------------------------" << std::endl;std::cout << "sharedPtrTest: " << spPtr1 << "\t" << spPtr1.use_count() << std::endl;std::cout << "sharedPtrTest: " << spPtr2 << "\t" << spPtr2.use_count() << std::endl;std::cout << "sharedPtrTest: " << spPtr3 << "\t" << spPtr3.use_count() << std::endl;std::cout << "------------------------------------" << std::endl;// 线程中std::thread thTest(sharedPtrTest01, std::ref(spPtr1), spPtr2, std::ref(spPtr3));thTest.join();std::cout << "------------------------------------" << std::endl;std::cout << "sharedPtrTest: " << spPtr1 << "\t" << spPtr1.use_count() << std::endl;std::cout << "sharedPtrTest: " << spPtr2 << "\t" << spPtr2.use_count() << std::endl;std::cout << "sharedPtrTest: " << spPtr3 << "\t" << spPtr3.use_count() << std::endl;std::cout << "------------------------------------" << std::endl;return;
}void main()
{sharedPtrTest();getchar();return;
}

std::shared_ptr作为函数形参,通过值传递、引用传递的问题解答相关推荐

  1. c语言值传递 地址传递 引用传递参数,C++参数传递(值传递,引用传递)

    值传递 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 在函数结束返回后,形参被丢弃释放,实参的内容不会被改变 数据值传递和地址值传递 数 ...

  2. java中是值传递引用传递_Java是按值传递而不是按引用传递

    java中是值传递引用传递 One of the biggest confusion in Java programming language is whether java is Pass by V ...

  3. php函数间参数传递(值传递/引用传递)

    为什么80%的码农都做不了架构师?>>>    函数间的参数传递包括值传递和引用传递. php:函数间的参数传递 1.值传递 复制代码代码如下: <?php  function ...

  4. 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )

    文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...

  5. 【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )

    文章目录 一.将 两头堵模型 抽象成业务模块函数 二.完整代码示例 一.将 两头堵模型 抽象成业务模块函数 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 , 一般使用 ...

  6. C专家编程--指针和数组(三) 值传递 指针传递 引用传递

    可以先看下这两篇文章 http://blog.csdn.net/yusiguyuan/article/details/12357381 http://blog.csdn.net/yusiguyuan/ ...

  7. 值传递 引用传递(传地址,传引用)的区别

    传值      是把实参的值赋值给行参      那么对行参的修改,不会影响实参的值           传地址      是传值的一种特殊方式,只是他传递的是地址,不是普通的如int      那么 ...

  8. 关于C#值类型,引用类型,值传递,引用传递

    说到参数传递,必须得弄清值类型和引用类型: (为了容易表达,我暂且命名存放在堆中的内容为堆中对象,存放在栈上的内容为栈中对象.) 值类型存放在栈中,直接访问.如果有:int a=0;int b=a;就 ...

  9. Python:值传递,引用传递?不存在的,是赋值传递

    Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...

最新文章

  1. EventBus3.0开发详解 近万开发者收藏
  2. 1042. Shuffling Machine (20)
  3. tm是什么域名_入驻天猫,需要什么条件?
  4. 国外地球物理强势学校与知名研究组
  5. 完美收官!java程序内存溢出找原因
  6. Complete Internet Repair(电脑网络修复工具)官方中文版V6.0.3.5003 | 富有成效的电脑网络修复大师 | 电脑网络修复怎么修复?
  7. pdf添加水印的方法,pdf加水印步骤
  8. 华为A1路由器设置虚拟服务器,华为a1路由器wifi定时加速功能的详细操作设置方法...
  9. 智能手机平台:TI,Intel,Moto
  10. 隐马尔科夫模型java实现
  11. 李笑来——我的销售概念与方法论
  12. 计算机设备 软件总账和明细账,广东省会计从业资格考试《初级会计电算化》实务操作练习题.doc...
  13. Windows下SVN服务器和客户端的下载和安装
  14. 4天完成一个物联网项目
  15. Week2云计算从0到1学习-已脱敏
  16. 2018年,中国顶尖名校毕业生都去哪儿了?
  17. python 西门子触摸屏通讯_详解博途编程实现S7300与西门子触摸屏通讯
  18. 修改XP开机画面最简单办法(图)
  19. 服务器主板开机显示英特尔,为什么我是intel的主板开机显示确实AMD主...-卓优商学问答...
  20. 从常用指令入手了解Linux系统 (Learn Linux from shell commands)

热门文章

  1. (已更新)谁是卧底线下发牌器微信小程序源码下载,强大的自定义功能
  2. Rubby在青柠互动的一月份工作总结
  3. 硬盘坏了影响计算机启动吗,电脑硬盘坏了就换?不花一分钱就能成功修复!
  4. Linux下的文本编辑器vi
  5. 俄罗斯方块源码(彩色版)
  6. 50天全民听力输入训练:Green Apple
  7. 网络行为监控管理系统
  8. 作团队感悟(9)----该对谁负责
  9. unity 穿山甲 广告关于如何将信息流广告和banner广告直接关闭窗口 而不是通过按钮
  10. js之一个有意思的逻辑题