day16|C++重难点之 什么是内存泄漏, 如何检测和防止? 什么是野指针?如何避免?
day16|C++重难点之 什么是内存泄漏, 如何检测和防止? 什么是野指针?如何避免?
43.什么是内存泄漏, 如何检测和防止?
(1)内存泄漏:
如果程序的某一段代码在内存池中动态申请了一块内存,但没有即使释放,就会导致 那块内存一直处于被占用状态,无法使用,造成了资源的浪费。内存泄漏并不是说 物理上的消失掉了,而是因为无法使用该区域,在外界看来 这块内存就好像被泄漏了一样
(2)什么操作会 导致内存泄漏?
- 忘记释放内存:使用 new 或 malloc 分配内存后,没有使用 delete 或 free 释放内存
- 子类 继承 父类 时,没有将 基类的析构函数 定义为 虚函数
- 野指针:指针 被赋值为nullptr 或 重新赋值 后,丢失了对先前分配的内存的引用,导致无法释放
- 循环引用:在使用 引用计数 的智能指针时(如 shared_ptr),循环引用 会导致 引用计数 永远不会归零,从而无法释放内存
- 使用不匹配的 内存释放函数 :使用 delete 释放 由 new[ ] 分配的内存,或使用 delete[ ]释放由 new 分配的内存,这可能会导致未定义的行为
- 资源未关闭:对于 文件、网络连接等资源,如果没有正确关闭,虽然不直接导致内存泄漏,但会占用系统资源,可能导致 资源耗尽
(3)如何检测?
使用工具,比如 Valgrind、AddressSanitizer 或 Visual Studio的诊断工具来检测内存泄漏
(4)如何避免?
- 使用智能指针,优先使用 unique_ptr、shared_ptr等智能指针 来 自动管理内存
- 确保资源释放:对于 手动分配的内存,确保在不需要时 使用delete 或 free 释放
- 内存泄漏工具:在开发和测试阶段,定期使用 内存泄漏检测工具 检查程序
44.什么是野指针?如何避免?
(1)什么是野指针
野指针是指 指向无效的或者是已经释放的内存的地址的指针。使用 野指针 可能会导致 程序崩溃、数据损坏或其他一些不可预测的行为
(2)在什么情况下会产生野指针?
- 在释放内存后 没有置空指针:使用delete 或 free 释放内存后,没有 将指针设置为nullptr,此时指针仍然指向 已释放的内存地址
- 返回局部变量的指针:如果函数返回了指向其 局部变量 的指针,当函数调用结束,这些 局部变量的生命周期 也就结束了,所以此时返回的指针就成了野指针
- 越界访问:指针访问的内存 超出了其合法的 内存块边界
- 函数参数指针被释放,也就是 传递进来的指针所指向的内存 在函数内部被释放了,此时 该指针成了野指针
(3)如何避免野指针
- 在释放内存后 将指针置为 nullptr
- 不要返回 指向局部变量的指针
- 使用 智能指针,比如 unique_ptr、shared_ptr
- 注意 函数参数的生命周期,避免 在函数内部释放 传递进来的指针所指向的内存
原文地址:https://blog.csdn.net/2402_84438596/article/details/143793634
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!