C++智能指针
分类
C++智能指针有share_ptr, unique_ptr, weak_ptr, auto_ptr, 其中auto_ptr是C++98中的用法,C++11已经弃用了。weak_ptr是为了配合share_ptr工作而引入的智能指针,其没有共享资源,其构造也不会引起指针引用计数的增加。weak_ptr主要是防止share_ptr出现循环引用和内存泄漏的问题。
share_ptr和unique_ptr的联系和区别
联系:
1.都是智能指针:区别于普通指针,能利用类的特性,避免内存泄漏问题;
2.RAII(资源获取即初始化):它们基于RAII原则,确保在离开作用域时释放相关资源,无需手动调用delete;
区别:
1.所有权管理不同:unique_ptr不允许多指针共享资源,同一时刻只能有一个unique_ptr指向给定对象;而多个share_ptr可以共享资源,可以访问同一个共享内存。share_ptr通过引用计数来管理资源的生命周期。当最后一个shared_ptr销毁时,内存才会被释放;
2.性能开销:unique_ptr没有引用计数的开销,比share_ptr更轻量级;share_ptr需要维护引用计数;
3.安全性:unique_ptr不会出现循环引用问题,但share_ptr可能出现循环引用和内存泄漏问题,share_ptr必要时得和weak_ptr一起使用。
share_ptr的特性
1.多种重载:解引用运算符重载(解引用运算符*和箭头运算符->),比较运算符重载(相等运算符==和不等运算符!=),bool运算符重载,赋值操作符重载(允许将一个std::shared_ptr赋值给另一个,并处理引用计数的递增和递减),这些重载使得share_ptr具备普通指针的性质;
2.线程安全
同一个share_ptr被多个线程读是安全,但写不安全的。只有共享引用计数的不同share_ptr被多个线程写才是安全的。