ZBLOG

std::shared_ptr p = std::make_shared(); std::thread t1{ thr, std::ref(p) } 和std::thread t1{ thr, p) } 有什么区别

std::thread t1{ thr, std::ref(p) }std::thread t1{ thr, p } 的区别在于参数传递的方式。

  • std::thread t1{ thr, std::ref(p) }: 这里使用了 std::ref() 来创建一个引用包装器,将 p 作为引用传递给线程函数。这意味着在线程函数中可以修改智能指针的内容,包括重新分配或释放资源。同时,如果在线程函数内部重新分配了指向其他对象的智能指针,则原来的 shared_ptr 的引用计数会减少,并可能导致未定义行为。

  • std::thread t1{ thr, p }: 在此情况下,没有使用 std::ref()。相反,复制了智能指针对象 p 并将其副本传递给线程函数。因此,在线程函数中对副本进行任何更改不会影响原始的智能指针对象。

总结:如果你希望在线程函数中可以修改智能指针内容(例如重新分配或释放资源),则应该使用引用传递 (std::ref(p));如果不需要在线程函数中修改智能指针对象,则直接传递副本即可(p)。根据需求和代码逻辑选择合适的参数传递方式。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=15673

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?