C++中采用该方式传递参数是否存在弊端?
这种参数传递写法的弊端分析
1. 传值传递std::shared_ptr的问题
每次以值传递方式传入std::shared_ptr,都会触发智能指针的拷贝操作:
- 拷贝过程中会对引用计数执行原子增减操作,这在高频调用的场景下会带来明显的性能开销;
- 函数内的
student_param会持有对象的所有权,只要这个局部智能指针还存活,对应的student对象就不会被销毁,可能导致不必要的资源占用。如果函数只是需要访问对象而非接管所有权,完全可以用const std::shared_ptr<student>&(引用传递)或者直接传student*/const student&,既避免拷贝,又不会意外延长对象生命周期。
2. 传递shared_ptr::get()返回的原始指针的风险
这种写法最大的隐患是悬空指针:
如果在test函数执行期间,外部的std::shared_ptr<teacher> tchr被意外销毁(比如其他线程调用reset()、main函数里提前释放),teacher_param就会变成指向已释放内存的悬空指针,后续对它的任何访问都会触发未定义行为。
而且这种写法直接绕过了shared_ptr的所有权管理逻辑——函数拿到的原始指针无法参与引用计数,完全依赖外部智能指针维护对象生命周期,一旦外部出现失误,函数内的操作会直接崩溃。
3. 代码语义混淆问题
同一个函数里混用值传递智能指针和原始指针,会让其他开发者困惑所有权语义:到底student_param是让函数共享所有权,还是teacher_param只是临时借用?这种模糊性会增加代码的维护成本,容易引发误用。
举个典型的危险场景:如果test函数把teacher_param保存到了一个全局容器中,后续main里的tchr被销毁后,容器里的指针就变成了无效指针,后续访问必然出问题。
内容的提问来源于stack exchange,提问作者O Connor
相关产品推荐
相关产品推荐

