• 内存泄漏


     堆上的内存由程序员申请和释放,不再使用的内存没有释放掉,导致内存泄漏。内存泄漏的常见场景:

    1 指向堆的指针重新赋值

      char *p1 = (char*)malloc(5);

      char *p2 = (char*)malloc(5);

      p1 = p2; //指针p1被指向p2指向的内存地址,但是p1之前指向的内存还没有被释放掉,那块内存就变成了孤立内存,无法释放了,因为现在没有指针指向该内存位置,导致内存泄漏。

      

    PS: 在对指针赋值前,一定要确保指针当前指向的内存位置不会变成孤立的

    2 错误的内存释放

      假设指针p指向10字节内存,其中包含一个指针np,np指向另外的内存地址。

      此时如果 free(p); 释放指针p指向的内存,那np指向的内存位置就变成了孤立的,也没法释放了,内存泄漏。

      

    PS:正确的释放内存的方法是,先释放np指向的内存位置,再释放p指向的内存位置:

      free(p->np);

      free(p);

       即:每当释放结构化的元素,该元素又包含指向动态分配的内存位置的指针时,应该先遍历子内存位置并释放,再遍历父节点

    3 申请的内存没有使用free进行释放

    PS:alloca函数申请的内存是栈上,由系统自动回收,alloca函数申请的内存不需要free释放

    4 返回值是指针时 

      char *getPointer()
      {
        char *p = (char*)malloc(100);
        return p;
      }

      int main()
      {
        getPointer(); //getPointer函数里分配了100字节内存,这儿调用getPointer函数但是并没有用指针接收返回值,导致没有指针指向该100字节内存,造成内存泄漏
        system("pause");
        return 0;
      }

  • 相关阅读:
    卷积,特征图,转置卷积和空洞卷积的计算细节
    keras中的shape/input_shape
    用”人话”解释CNN —— 对单个特征图进行视觉化
    MINST手写数字识别(三)—— 使用antirectifier替换ReLU激活函数
    MINST手写数字识别(二)—— 卷积神经网络(CNN)
    [LeetCode] Sqrt(x)
    [LeetCode] Text Justification
    [LeetCode] Valid Number
    [LeetCode] Minimum Path Sum
    [LeetCode] Unique Paths II
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10256227.html
Copyright © 2020-2023  润新知