c/c++内存泄漏

内存泄露:

#include <stdio.h>
#include <stdlib.h>
int main(){
    char *p = (int*)malloc(10 * sizeof(int));
    p = (int*)malloc(5 * sizeof(int));
    free(p);
    p = NULL;  //赋值为NULL,避免成为野指针。
    return 0;
}
分析这段代码:
  1. 开辟了10个int大小的数组指针p

  2. 给指针p重新指向了5个int大小类型的数组

  3. 释放指针p

  4. 释放之后只是释放内存,并不会同时释放指针,所以避免野指针并且阈予NULL值。

  5. return 程序结束。

    问题的关键是指针p刚开始指向了10个int大小类型的数组,但是随后又重新指向新的5个int类型大小的堆内存,然后释放p指针这段内存就导致只是释放了5个int类型大小的数组内存,并没有释放第一次的内存,这就是内存泄露,最终程序运行结束之后才会被操作系统回收
还有一种情况就是:
int *old = (int*)malloc(sizeof(int)*10);
int *new = (int*)malloc(sizeof(int)*10);
new = old;
free(new)

其实free释放内存可写也可以不写, 但是分情况,一个小程序,使用内存少,运行结束之后系统回收也就没事了,但是一个大的工程里面,很有可能申请好几G大小的内存,毕竟使用堆内存就是为了他的容量,或者重复申请内存,不及时释放的话申请的内存越来越多, 再说申请的内存大多数是虚拟内存,虚拟内存的操作是读写磁盘的,所以会严重影响程序的性能。

内存泄露和溢出的区别:
溢出:你打开画本,画啊画,画满了,就画到桌子上了
泄漏:你打开画本,画一页又一页,突然发现有一页被人画过了
溢出的原理就更简单了,请的内存超过了可用内存,内存不够用了,比如申请了10m的内存,但是一共只有5m,申请不了,就溢出了
posted @ 2020-03-14 21:39  hornets  阅读(184)  评论(0)    收藏  举报