内存泄漏、指针越界

内存泄漏

内存泄漏是指在程序运行时,分配给程序使用的内存空间没有被及时地释放回系统,一直占用着系统资源,导致系统内存不足,最终导致系统性能下降或者程序崩溃等问题。

内存泄漏分类

1. 堆内存泄漏:

指在程序运行期间动态分配的内存没有被正确释放,导致程序在运行过程中逐渐占用越来越多的内存,直至最终耗尽系统内存。

2. 栈内存泄漏:

指在程序运行期间使用栈空间分配的内存没有及时归还给系统,导致程序慢慢地占用越来越多的内存。

3. 指针问题导致内存泄漏:

在程序中使用了指针,但未将指针指向的内存空间释放,导致内存泄漏。

4. 资源未关闭导致内存泄漏:

程序中使用了一些资源,如文件、网络连接等,在使用完毕后未正确关闭,导致内存泄漏。

5. 缓存导致的内存泄漏:

程序使用缓存的方式,但缓存中的数据无法及时清理,导致内存泄漏。

6. 循环引用引发的内存泄漏:

当两个或多个对象相互引用时,由于它们之间相互依赖,不能自动删除。此时如果程序不及时释放它们所占用的内存,则会导致内存泄露。

7. 多线程同步内存泄漏:

在多线程编程中,如果一个线程创建了对象并在使用完之后没有及时销毁,则会导致内存泄露。

8. 内存碎片引发的内存泄漏:

在内存申请和释放过程中,可能会存在一些较小的内存块无法被正确回收,这些小的内存块会一直存在于程序中,从而导致内存泄漏。

内存泄漏弊端:

  1. 内存资源浪费。内存泄漏会导致程序占用大量的内存资源,并且这些内存无法被程序释放,从而导致内存资源的浪费。
  2. 程序性能下降。内存泄漏会导致程序的内存占用越来越高,从而导致程序性能下降。
  3. 程序稳定性下降。如果内存泄漏的情况很严重,可能会导致程序崩溃甚至系统崩溃。
  4. 安全问题。如果内存泄漏的数据包含敏感信息,可能会导致信息泄露,从而造成安全问题。

检查内存泄漏的工具:

检查内存泄漏的工具有 Valgrind、LeakTracer、Memcheck、DMalloc、Electric Fence、MPatrol 等。其中 Valgrind 是最常用的内存泄漏检查工具之一。

避免内存泄漏编程规范:

  1. 在使用 malloc或者 new 关键字动态分配内存时,必须记得在程序结束后释放内存。
  2. 在使用指针时,一定要小心。一个指针变量如果没有被正确初始化或被赋值,它的值是不确定的。
  3. 避免出现连续多次调用嵌套函数,容易出现栈内存耗尽或者栈溢出情况。
  4. 在使用动态数组时,要注意边界问题。动态数组的边界问题容易导致内存泄漏问题。
  5. 尽量避免使用全局变量,因为全局变量有可能造成内存泄漏问题,增大开发难度。
  6. 智能指针。

指针越界

指针越界是指程序访问了超出所分配内存空间的地址,导致程序崩溃或者数据丢失

常见的情况有:

  1. 访问数组时下标越界。
  2. 使用指针访问未分配内存。
  3. 使用已释放的内存。
  4. 使用未初始化的指针。

为了避免指针越界,可以采取以下措施:

  1. 确保数组访问时下标不超过数组范围。
  2. 在使用指针时分配内存,并确保指针指向已分配内存。
  3. 释放内存时,将指针置为 NULL,避免未释放的内存被访问。
  4. 在声明指针时进行初始化。

内存泄漏和指针越界的区别:

内存泄漏和指针越界都是常见的程序错误。

内存泄漏指的是程序在动态分配内存后没有正确释放,导致系统内存资源的浪费,最终可能导致程序崩溃。

指针越界是指程序访问了超出所分配内存空间的地址,导致程序崩溃或者数据丢失。

两者的区别在于前者是内存资源管理不当导致,而后者则是访问非法的内存地址所导致。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值