辽阳市网站建设,网站建设 安庆,自己开发的app如何上线,网店搜索引擎优化的方法文章目录为什么需要智能指针#xff1f;内存泄漏什么是内存泄漏#xff0c;内存泄漏的危害内存泄漏分类#xff08;了解#xff09;如何避免内存泄漏智能指针的使用及原理smart_ptrauto_ptrunique_ptrshared_ptr线程安全的解决循环引用weak_ptr删除器为什么需要智能指针内存泄漏什么是内存泄漏内存泄漏的危害内存泄漏分类了解如何避免内存泄漏智能指针的使用及原理smart_ptrauto_ptrunique_ptrshared_ptr线程安全的解决循环引用weak_ptr删除器为什么需要智能指针
我们先来看一段代码
大家觉得这段代码有什么问题 发生了内存泄漏。
因为p1,p2,p3指向的空间没有释放掉导致的。这就是异常安全问题。那要怎么解决呢我们下面再回答。
内存泄漏
什么是内存泄漏内存泄漏的危害 内存泄漏分类了解
堆内存泄漏(Heap leak) 堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放那么以后这部分空间将无法再被使用就会产生Heap Leak。系统资源泄漏 指程序使用系统分配的资源比方套接字、文件描述符、管道等没有使用对应的函数释放掉导致系统资源的浪费严重可导致系统效能减少系统执行不稳定。
如何避免内存泄漏 智能指针的使用及原理 smart_ptr 那么smart_ptr能解决上面遗留的问题吗答案是可以的。 那么这个smart_ptr还有一些什么问题呢
没错就是拷贝构造或者拷贝赋值的时候就会出问题因为析构的时候同一块空间会被析构两次这时候就会报错。那么该怎么解决呢
auto_ptr
这时候就有人提出了管理权转移的思想来解决这个问题。 大家可以看到auto_ptr很好的解决了上面的问题但是auto_ptr自身有一个很大的问题大家知道吗就是悬空问题。 从上图可以看出p1变成悬空指针且程序无法正常运行。 从中可以看出auto_ptr是一个失败的设计并且很多公司都禁止使用auto_ptr.
unique_ptr
经过上面的尝试发现不行后有人就想出了一个简单粗暴的办法我直接防拷贝不就好了也不用想那么多。
shared_ptr
但是要是我们真的需要多个指针管理一块空间那该怎么解决之前的那个问题呢这时候就用到了shared_ptr。 shared_ptr的思想是用引用计数来解决多个指针指向同一块空间的问题。 从上面我们可以看到shared_ptr解决了之前的问题。那么上面实现的shared_ptr还有什么问题线程安全问题。
我们可以看到当n较小的时候并不会发生线程安全问题但是当比较大的时候呢 我们可以看到当n为10万的时候就发生了线程安全问题。 所以我们应该加锁。
线程安全的解决 我们可以看到加锁后引用计数变的正常智能指针也正常析构。这时大家肯就会有问题为什么数据的不正确那么shared_ptr还是线程安全的吗算。
循环引用
那么现在的shared_ptr就完整了吗它还有没有什么问题每次就是循环引用。 我们可以看到最终对象没有被销毁。那么没有循环引用呢 我们可以看到没有循环引用时对象被正常销毁。那么该怎么解决这个问题呢这时就用到了weak_ptr。
weak_ptr
weak_ptr的思想就是只使用不负责管理和释放。
删除器
删除器需要我们自己写一个仿函数显示传给智能指针 这里实现的是unique_ptr的删除器shared_ptr的删除器底层实现比较麻烦大家有兴趣可以自己去了解。