鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

合理使用智能指针,采用unique_ptr代替shared_ptr

【说明】 合理正确的使用智能指针,可以有效的避免内存泄漏、野指针、重复释放的场景。在有明确的独占所有权的情况下,推荐使用unique_ptr代替shared_ptr

【原理】 unique_ptr满足zero cost abstraction的特点,内存使用上没有任何开销,性能也与裸指针非常接近。而shared_ptr维护一个裸指针和额外的引用计数控制块。额外的控制块会导致一些场景下增加性能开销:

  • 为引用计数控制块申请额外的内存(多一次内存申请)。
  • 控制块的计数器使用原子变量,计数增减比普通变量慢。
  • 控制块使用了继承和虚函数也会导致不必要的性能开销。

【注意事项】 不涉及

【案例】

优化前
void Func()
{
    shared_ptr<Base> base = make_shared<Derived>();
    // use base locally, without copying it -- refcount never exceeds 1
} // destroy base

说明:函数中使用场景是在一个局部内使用,并且没有多个归属主,因此可以使用unique_ptr替换。

优化后
void Func()
{
    unique_ptr<Base> base = make_unique<Derived>();
    // use base locally
} // destroy base