C++11智能指针

2023-12-16 05:23:34

????????C#和java有自动垃圾回收机制,所以内存管理问题不大,但是C++没有这个机制所以内存管理需要注意。

? ? ? ? 使用智能指针可以解决内存泄漏的问题,智能指针对象中有个指针存储动态创建对象的地址,用于生存期的控制,能确保在智能指针对象离开作用域时自动正确的销毁动态创建的对象,防止内存泄漏。

? ? ? ? ?智能指针和裸指针的用法类似,只是可以自动释放分配的内存。

裸指针存在的问题:

1.难以区分指向的是一个对象还是一组对象

2.使用完指针不能确定是否销毁该指针,因为不能确定指针是否“拥有”指向的对象

3.在确定需要销毁的情况下,也不知道该用什么机制销毁,是delete还是其它的(比如文件指针用的是fclose())

4.即使确定了销毁的方法,由于1的原因,也不能确保正确销毁

5.即使上述问题都解决了,也很难保证在代码的所有路径中(分支结构,异常导致的跳转),仅有一次销毁操作,任何一条路径遗漏都会导致内存泄漏

6.理论上没办法判断指针是否处于悬挂状态(如果两个指针指向同一片地址空间,其中一个指针释放了,另一个指针就会不知所措)

RAII过程(a.获取资源(创建对象)b.使用资源 c.销毁资源)

1.设计一个类封装资源

2.在构造函数中初始化

3.在析构函数中执行销毁操作

4.使用时定义一个该类的对象

std::shared_ptr: 内存由多个指针变量共同使用,共同拥有内存的所有权。不要用delete。 但是必须杜绝循环拷贝、杜绝和裸指针一起使用(交叉引用)——当所有的共享指针都被摧毁,对应的资源也会被摧毁,而这时候裸指针还指向着资源,裸指针就悬空了。

std::unique_ptr :内存的所有者或者说管理者必须是唯一的。 如果进入不同的模块或者调用者,那么执行所有权转移。它也可以自动管理对象,当它被销毁了那么它绑定的资源也会被销毁(reset()释放或转移资源,release()释放资源delete并且置nullptr)。它不能拷贝构造或者赋值,但是使用过程面以避免传值,有以下三种方式实现:

1.move()

? ?unique_ptr<int> up1=make_unique<int>(100);

? ?unique_ptr<int> up2(up1.release());

? ?unique_ptr<int> up2=move(up1);

2.传左值

? ?auto up=make_unique<int>(100);

? ?fun(up.get());

3.传引用

std::weak_ptr: 作为shared_ptr的伴侣对内存的使用仅仅是访问而已,不涉及其生命周期的管理。

它是一个观察者,它没有管理对象的权利甚至需要访问对象都要先临时创建一个shared_ptr(把weak_ptr转换成shared_ptr)。

当使用shared_ptr出现环形依赖的时候,使用weak_ptr的lock检测资源是否还在。

weak_ptr<int> wp;

shared_ptr<int> sp=make_shared<int>(100);

wp=sp;

auto look=wp.lock();

if(look) //资源还在

文章来源:https://blog.csdn.net/qq_60012598/article/details/134428989
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。