想知道不同的内存泄漏情况

时间:2017-04-10 13:03:40

标签: c memory memory-management memory-leaks

我很好奇你编写C程序时内存泄漏的情况。

以下是内存泄漏的例子吗?

  1. 尝试访问未对您的程序进行访问的内存部分,或者当您尝试访问不在那里的阵列位置时。
  2. #include <stdio.h>
    
    int main(void)
    {
         int num[5];
    
         int i;
    
          for(i=0;i<5;i++)
               scanf("%d", (num+i));
    
       printf("%d\n", num[5]); //printing the data stored at loc num[5] which is not present.
    
          return 0;
    }
    
    1. 打印存储在未初始化变量中的值。

    2. void*memcpy(const*dst,void const*src,size_t n)src指针指向相同的内存地址或函数在地址重叠时未定义时,会发生dst函数内存泄漏。

    3. 在已经释放的相同指针上多次使用free()。例如:

    4. #include <stdio.h>
      
      int main(void)
      {
      
          int*num = NULL;
      
          int i;
      
          num = (int*) calloc(sizeof(int), 5);
      
          for (i = 0; i < 5; i++)
              scanf("%d", (num + i));
      
          free(num);
          free(num);
          return 0;
      }
      

1 个答案:

答案 0 :(得分:2)

所有上述情况都会导致undefined behavior

  • printf("%d\n", num[5]);是超出内存的访问权限。

  • 如果变量具有陷阱表示,则打印存储在未初始化变量中的值会导致UB。

  • memcpy(),UB。

  • 中的来源和目的地重叠
  • 多个free()也是UB。

此外,内存泄漏与任何无效访问无关,只是浪费内存导致系统内存不足。您可以阅读有关here的更多信息。