🏆 个人主页:🎈 @太阳哥哥 🎈
🎁 本文收录专栏:🎈C++学习之路 🎈
🛒 其他专栏:🎈 ARM学习之路 🎈
📝 学习格言:路漫漫其修远兮,吾将上下而求索
💡 欢迎点赞、关注、收藏( •̀ ω •́ )✧ 一起努力,一起学习!
目录
🎈 智能指针
裸指针:直接用new
返回的指针,强大灵活,但是需要开发者全程维护。
智能指针:将裸指针开辟的堆空间交给智能指针管理,能够“自动释放所指向的对象内存”。用来帮助我们进行动态分配对象(new出来的对象)的生命周期的管理。能够有效防止内存泄漏。
C++标准库std提供四种智能指针:
auto_ptr(自动管理)C++98,已经被unique_ptr取代。
unique_ptr(独占式指针)C++11,同一时间内,只有一个指针指向该对象。
shared_ptr(共享指针)C++11,共享式指针。多个指针指向同一个对象,最后一个指针被销毁时,这个对象会被销毁。
weak_ptr(弱指针)C++11,用来辅助shared_ptr。
🎈 auto_ptr
auto_ptr用于c++98,是C++11之前的智能指针,c++11中已经被unique_ptr所取代,因为unique_ptr更为严谨。
格式:auto_ptr<类型>对象名(指针对象)
// 定义智能指针 auto_ptr<Test> test(new Test);
atuo_ptr其问题所在:
复制和赋值都会 改变atuo_ptr所指向资源的所有权;
不支持对象数组的操作;
在 STL 容器中使用auto_ptr存在重大风险,因为容器内的元素必需支持可复制和可赋值;
🎈 unique_ptr
unique_ptr(唯一指针)
唯一指针也被称为独占式指针,是受限制的共享指针,绑定一个指针指向对象。当对象被销毁时,会在其析构函数中删除原始指针。
特性:
两个指针不能指向同一个资源。
保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。
无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值。
格式:unique_ptr<类型>对象名(指针对象)
unique_ptr<Test> test(new Test); unique_ptr<int[]> array(new int[5]);//对象数组
🎈 shared_ptr(共享指针)
shared_ptr智能指针可以在任何地方都不使用时,自动删除相关指针,从而帮助彻底消除内存泄漏和悬空指针的问题。 它遵循共享所有权的概念,即不同的 shared_ptr 对象可以与相同的指针相关联,并在内部使用引用计数机制来实现这一点。
shared_ptr 对象在内部指向两个内存位置:
指向对象的指针。
用于控制引用计数数据的指针,新的shared_ptr在与对象相关联时,其构造函数将与此指针关联的引用计数增加1;当shared_ptr没在作用域时,其构造函数将与此指针关联的引用计数减1。当引用计数为0时,自动调用delete函数释放该内存空间。
shared_ptr成员函数:
use_count() 绑定的指针个数。
unique() 返回是否是独占所有权( use_count 为 1)
swap(shared_ptr对象) 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset() 放弃内部对象的所有权或拥有对象的变更。
get() 返回内部对象(指针)的地址,。
🎈 weak_ptr(弱指针)
协助共享指针工作,解决共享指针循环引用的时候会造成资源得不到释放的问题。与共享指针一起使用,作为共享指针的备份,弱指针的存在,不影响共享指针的释放。使用weak_ptr 来打破循环引用,它与一个 shared_ptr 绑定,但却不参与引用计数的计算。
(1)用shared_ptr进行初始化
(2)成员函数expired
(3)用于判断shared_ptr是否被释放
示例程序:
#include "iostream"
using namespace std;
class Son;
class Father
{
public:
~Father()
{
cout << "Father释放资源" << endl;
}
weak_ptr<Son>son;//弱指针
};
class Son
{
public:
~Son()
{
cout << "Son释放资源" << endl;
}
weak_ptr<Father>father;//弱指针
};
int main()
{
Father* father2 = new Father();
Son* son2 = new Son();
shared_ptr<Father>father1(father2);
shared_ptr<Son>son1(son2);
father2->son = son1;
son2->father = father1;
cout << "与Father绑定的共享指针的个数:" << father1.use_count() << endl;
cout << "与Son绑定的共享指针的个数:" << son1.use_count() << endl;
return 0;
}
执行程序结果:
与Father绑定的共享指针的个数:1 与Son绑定的共享指针的个数:1 Son释放资源 Father释放资源