【问题标题】:How a pointer be deallocated after it's initialized inside a function or an if-else statement?在函数或 if-else 语句中初始化指针后如何释放指针?
【发布时间】:2020-12-30 21:27:58
【问题描述】:

我从来没有想过这个,但我有点好奇,但是如果我在这样的 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?
}

【问题讨论】:

  • 第一个是内存泄漏。第二个分配内存5次,释放5次,所以这个就ok了

标签: c if-statement pointers memory-management dynamic-memory-allocation


【解决方案1】:

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

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

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

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

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

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

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

这样想:

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

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

【讨论】:

  • pif 语句中生成,在if 语句执行后将消失,但分配的内存仍在,这可能导致内存泄漏,对吗?跨度>
  • 描述:'动态分配内存,p指向'有点误导。我们没有在此处分配 p 指向的内存,因为p 在分配时没有任何意义。代码中发生的事情最好描述为“我们动态分配内存并将指向它的指针存储在p”。
  • @LastSecond959 完全正确!
  • @CiaPan 我同意,改写回答,tnx!
猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 2016-01-22
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2011-07-08
相关资源
最近更新 更多