【问题标题】:Want to Know About Different Scenario of Memory Leaks想知道内存泄漏的不同场景
【发布时间】:2017-04-10 13:03:39
【问题描述】:

我只是对编写 C 程序时如何发生内存泄漏感到好奇。

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

  1. 尝试访问未授予程序访问权限的内存部分,或者当您尝试访问不存在的数组位置时。

#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. srcdst 指针指向相同的内存地址或地址重叠时函数未定义时,会发生使用void*memcpy(const*dst,void const*src,size_t n) 函数内存泄漏。

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


#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;
}

【问题讨论】:

  • 那为什么要标记C++
  • 内存泄漏仅表示您使用了malloc 而没有使用free。这不会立即成为问题,但是当在循环中完成时,它最终会耗尽所有可用内存,这将阻止程序正常运行。
  • 嗯?当指向已分配内存区域的指针的所有用户副本丢失时,您就会泄漏,例如。被覆盖。
  • 您似乎在谈论一般的内存相关问题,而不仅仅是内存泄漏。事实上,你的例子都不是关于内存泄漏的。
  • @ThingsWotsit 我正在确认这是否是例如内存泄漏。

标签: c memory memory-management memory-leaks


【解决方案1】:

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

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

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

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

  • 多个free()也是UB。

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

【讨论】:

  • @noble_liar 好的,不要误导,一旦你有了UB,有没有内存泄漏都无所谓,首要的是修复UB的情况,然后我们可以考虑内存泄漏。 :)
  • :) 你能帮我理解这一点,程序的未定义行为如何能够治愈内存泄漏?未定义的行为和内存泄漏之间有什么区别......感谢您的回答。
  • @noble_liar 1) 它们没有直接关系。 2)请阅读答案中的链接。
  • @noble_liar “未定义的行为”意味着程序可以做任何它喜欢的事情。它可能导致内存泄漏,它可以治愈内存泄漏(不太可能),它可以格式化硬盘驱动器。随便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多