指针在函数或 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
将被分配 每个循环 执行一次,这是 正确的行为 。
这样想:
- 第一个循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocate p
指向的内存。
- 第二个循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocate p
指向的内存。
- 第三个循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocate p
指向的内存。
- 第 4 次循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocate p
指向的内存。
- 第 5 次循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocate p
指向的内存。
PS: 与你的问题无关,但请阅读:Do I cast the result of malloc? 否。
我从没想过这个,但我有点好奇,但是如果我像这样在 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
将被分配 每个循环 执行一次,这是 正确的行为 。
这样想:
- 第一个循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocatep
指向的内存。 - 第二个循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocatep
指向的内存。 - 第三个循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocatep
指向的内存。 - 第 4 次循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocatep
指向的内存。 - 第 5 次循环:我们动态分配内存并在
p
中存储指向它的指针。 De-allocatep
指向的内存。
PS: 与你的问题无关,但请阅读:Do I cast the result of malloc? 否。