指针在函数或 if-else 语句中初始化后如何被释放?

How a pointer be deallocated after it's initialized inside a function or an if-else statement?

我从没想过这个,但我有点好奇,但是如果我像这样在 if-else 语句中初始化一个指针会怎样?

if (true)
{
    int *p=(int*)malloc (sizeof (int));
}   // Will p be freed here?
// Can't free (p) here since it is not in this scope

我认为代码几乎说明了我的问题的所有内容......我实际上有这样的想法,有必要在 if 语句的末尾添加 free(p),但是如果它在一个循环内?

for (int x=0; x<5; x++)
{
    int *p=(int*)malloc (sizeof (int));
    // Some code here
    free (p);   // Will p deallocated 5 times or just once?
}

在您的第一个示例中,不会。您刚刚引入了 内存泄漏,哎呀!

p 是一个变量(指针),作用域在 if 语句的主体内。

因此,当我们到达该主体的末尾时,p 将超出范围,并且您将没有任何指针可用于您刚刚在 if 语句主体开头动态分配的内存.

因此,您无法释放该内存(因为您没有指针传递给释放方法)。

要修复此代码,您应该这样做:

if (true)
{
  int *p = malloc (sizeof (int));
  free(p);
}

在您的第二个示例中,p 将被分配 每个循环 执行一次,这是 正确的行为

这样想:

  1. 第一个循环:我们动态分配内存并在p中存储指向它的指针。 De-allocate p指向的内存。
  2. 第二个循环:我们动态分配内存并在p中存储指向它的指针。 De-allocate p指向的内存。
  3. 第三个循环:我们动态分配内存并在 p 中存储指向它的指针。 De-allocate p指向的内存。
  4. 第 4 次循环:我们动态分配内存并在 p 中存储指向它的指针。 De-allocate p指向的内存。
  5. 第 5 次循环:我们动态分配内存并在 p 中存储指向它的指针。 De-allocate p指向的内存。

PS: 与你的问题无关,但请阅读:Do I cast the result of malloc? 否。