智能指针:shared_ptr
初始化:
1、常规初始化(shared_ptr 与new 一起使用);2、使用make_shared方法
常用操作、计数与自定义删除器
计数
每个shared_ptr会记录有多少个其它shared_ptr指向相同的对象
以下三种情况会增加shared_ptr的计数
1、用该智能指针初始化另外一个智能指针、会导致所有指向该对象的shared_ptr引用计数增加1
2、把智能指针当成实参传递到函数中
3、智能指针作为函数的返回值
引用计数减少的三种情况
1、给shared_ptr赋一个新的值,指向新的对象,指向旧的对象的所有的shared指针计数减少一个
2、局部的共享指针离开其作用域
3、当一个共享指针的计数变为0,会自动释放管理的对象(内存)
shared指针常用函数
1、use_count成员函数:返回多少个智能指针指向某个对象
示例:
shared_ptr<int>myptr(new int(100));
int icount = myptr.use_cout();//此时 icout的值为1
shared_ptr<int> myptr2(myptr);
shared_ptr<int>myptr3;
myptr3=myptr2;
int icount = myptr.use_cout();//此时 icout的值为3
int icount = myptr3.use_cout();//此时 icout的值为3
2、unique成员函数
若只有一个智能指针指向某个对象,则unique返回true 否则返回false
myptr.unique()
3、reset函数(ptr.reset() )
**当reset不带参数时。
若pi是唯一指向该对象的指针,则释放pi指向的对象,将pi置空。
若pi不是唯一指向该对象的指针,则不释放pi指向的对象,但指向该对象引用计数会减1,同时将pi置空。
**当reset带参数(一般是一个new出来的指针)时。
若pi是唯一指向该对象的指针,则释放pi指向的对象,让pi指向新内存。
若pi不是唯一指向该对象的指针,则不释放pi指向对象,但指向该对象的引用计数会减1,同时让pi指向新内存。
shared_ptr<int>myptr(new int (100))
myptr.reset(new int (1))//释放原内存,指向新的内存
**空指针也可以通过reset来重新初始化
shared_ptr<int>p; //p当前是空指针
p.reset(new int(100)) //释放p指针原先指向的对象,重新指向新对象,但由于原先为空指针,即不进行内存释放
4、*解引用
智能指针解引用获取,指针指向的对象
5、get成员函数(ptr.get())
从智能指针转换为普通指针,但是不能在智能指针管理的内存被释放的时候还使用转换后的普通指针,不更改原先智能指针的所有权
// 创建一个动态分配的整数,并使用 std::unique_ptr 进行管理
std::shared_ptr<int> ptr(new int(42));
// 使用 get() 方法获取指向的原始指针(转为普通指针)
int* rawPtr = ptr.get();
不可以在原始指针被智能指针管理的情况下手动释放资源,因为智能指针会在其生命周期结束时自动释放资源
将智能指针转换为普通指针的两个函数 release与get的异同 ptr.方法()
-
release() 函数:
release()
函数用于释放智能指针对所管理资源的所有权,并返回指向该资源的原始指针。- 调用
release()
后,智能指针不再管理该资源,资源的所有权被交还给了调用者。 - 释放资源的所有权意味着智能指针不再负责资源的销毁,需要调用者负责手动管理资源的释放,否则会发生内存泄漏。
release()
函数通常用于在某些需要手动管理资源的情况下,如与使用C语言API交互,或者需要将资源转移给其他智能指针。
-
get() 函数:
get()
函数用于获取指向所管理资源的原始指针,但不影响智能指针对资源的管理。- 调用
get()
函数将返回一个指向所管理资源的原始指针。 - 与
release()
不同,get()
函数并不释放智能指针对资源的所有权,智能指针仍然继续管理该资源,负责资源的销毁。 get()
函数通常用于需要使用智能指针管理的资源的原始指针,但不希望影响智能指针的所有权。
6、swap成员函数
用于交换两个智能指针所指向的对象,引用计数并不发生变化
oldptr.swap(newptr);//old指向的内容交换到new进行指向。
7、=nullptr
将所指向对象的引用计数减一,若引用计数变为0,则释放智能指针所指向的对象,将智能指针置空。
(可以判断该指针是否为空)
8、智能指针名作为判断条件,返回为bool结果,判断该智能指针是否为空