Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 想知道内存泄漏的不同情况吗_C_Memory_Memory Management_Memory Leaks - Fatal编程技术网

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

C 想知道内存泄漏的不同情况吗,c,memory,memory-management,memory-leaks,C,Memory,Memory Management,Memory Leaks,我只是好奇当你写一个C程序时,内存泄漏是怎么发生的 以下是内存泄漏的示例吗 尝试访问未授予程序访问权限的内存部分,或尝试访问不存在的阵列位置时 所有上述情况都会导致 printf(“%d\n”,num[5])是越界内存访问 打印存储在未初始化变量中的值,如果该变量具有陷阱表示,则会导致UB 源和目标在memcpy(),UB中重叠 多个free() 此外,内存泄漏与任何无效访问无关,它只是导致系统内存不足的内存浪费。您可以阅读更多相关信息。那么为什么标记C++?内存泄漏只意味着您使用了mal

我只是好奇当你写一个C程序时,内存泄漏是怎么发生的

以下是内存泄漏的示例吗

  • 尝试访问未授予程序访问权限的内存部分,或尝试访问不存在的阵列位置时


  • 所有上述情况都会导致

    • printf(“%d\n”,num[5])是越界内存访问

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

    • 源和目标在
      memcpy()
      ,UB中重叠

    • 多个
      free()


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

    那么为什么标记
    C++
    ?内存泄漏只意味着您使用了
    malloc
    ,而没有
    free
    。这不是一个立即的问题,但当在循环中完成时,它最终会耗尽所有可用内存,这将阻止程序正常运行。嗯?当指向已分配内存区域的指针的所有用户副本丢失(例如被覆盖)时,您就会泄漏。您似乎在谈论与内存相关的一般问题,而不仅仅是内存泄漏。事实上,你的例子中没有一个是关于内存泄漏的。@thingswots我正在确认这是否是内存泄漏的例子。@noble\u liar好的,不要误导,一旦你有了UB,内存泄漏与否无关紧要,首要任务是修复UB案例,然后我们可以考虑内存泄漏:)你能帮我理解这个吗?一个程序的未定义行为是如何解决内存泄漏的?未定义的行为和内存泄漏之间有什么区别。。。。谢谢你的回答。@noble\u liar 1)他们没有直接关系。2) 请阅读答案中的链接。@noble\u liar“未定义的行为”意味着程序可以做任何它喜欢的事情。它可以导致内存泄漏,可以修复内存泄漏(不太可能),可以格式化硬盘驱动器。无论什么
    #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;
    }
    
    #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;
    }