合理设计智能指针的参数与返回值可避免内存泄漏和性能损耗。1. 参数传递优先使用const T&或T*,仅在需共享生命周期时用const std::shared_ptr<T>&;2. 返回新对象应使用std::unique_ptr或std::shared_ptr明确所有权;3. 成员函数避免滥用shared_from_this();4. 创建对象首选std::make_unique和std::make_shared以提升安全与性能。

在C++中使用智能指针时,函数参数和返回值的设计直接影响内存安全和性能。合理选择传递方式能避免资源泄漏、拷贝开销和生命周期问题。核心原则是:按需传递所有权,明确语义,优先使用const引用或原始指针接收。
1. 函数参数传递:不获取所有权时使用引用或指针
如果函数只是临时使用对象,不应接管其生命周期,应避免传值传递
std::shared_ptr
或
std::unique_ptr
。
- 接受
const T&
:适用于只读访问,最高效
- 接受
T*
:允许空值,适合可选对象
- 接受
const std::shared_ptr<T>&
:仅当需要延长对象生命周期(如保存弱引用)
错误示例:
void process(std::shared_ptr<MyObj> obj); // 不必要地增加引用计数
正确做法:
void process(const MyObj& obj); // 推荐 void process(MyObj* obj); // 可接受null时 void process(const std::shared_ptr<MyObj>& obj); // 需共享所有权时
2. 返回智能指针:明确所有权转移
函数创建新对象时,应通过智能指针返回所有权。
- 返回
std::unique_ptr<T>
:独占所有权,轻量高效
- 返回
std::shared_ptr<T>
:允许多方共享
避免返回原始指针或引用,除非对象生命周期由其他机制管理。
立即学习“C++免费学习笔记(深入)”;
AIAgent.app 是一个可以让你使用AI代理来完成各种任务的网站,有效提升创造生产力
131
查看详情
推荐写法:
std::unique_ptr<File> openFile(const std::string& path); std::shared_ptr<Logger> getLogger();
3. 成员函数中的智能指针使用
成员函数通常不需要用
shared_ptr
访问自身,除非要传递给外部并延长生命周期。
- 避免在成员函数内调用
shared_from_this()
除非必要
- 若需将
this
包装成
shared_ptr
,类必须继承
std::enable_shared_from_this
注意:不要对非动态分配对象或已释放对象调用
shared_from_this()
。
4. 工厂函数与make系列辅助函数
创建对象时优先使用
std::make_unique
和
std::make_shared
。
- 异常安全:防止资源泄露
- 性能优化:
make_shared
合并内存分配
- 代码简洁:自动类型推导
示例:
auto widget = std::make_unique<Widget>(param); return std::make_shared<Service>(config);
基本上就这些。关键是理解所有权语义,传参时不轻易复制智能指针,返回时清晰表达生命周期责任。不复杂但容易忽略细节。
大家都在看:
c++中如何使用GDB调试程序_GDB命令行调试核心技巧
C++STL map容器键值对操作技巧
C++数据预取技术 硬件预取器利用
C++开发学生信息查询系统方法

































暂无评论内容