合理使用智能指针,采用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
父主题: C++语言