当 malloc 变量也已分配给另一个变量时,我应该如何释放它? (C语言)
How should I free a malloc variable when it has been assigned to another variable as well? (C Language)
抱歉,如果有人问过这个问题。
我有这个程序:
int main()
{
int *X = (int *) malloc(sizeof(int));
*X = 10;
int *Y = X;
free(Y);
return 0;
}
我不知道代码是否正确。我还需要像为 X
调用 malloc()
那样调用 free(X)
吗?我是否也需要为 Y
调用 malloc()
,或者 Y
就这样好吗?
此代码不正确,因为未包含所需的 header stdlib.h
并且未检查 malloc()
的结果。 malloc()
在 C 中的转换结果也是 discouraged.
正确的代码是:
#include <stdlib.h>
int main(void)
{
int *X = malloc(sizeof(int));
if (X == NULL) return 1;
*X = 10;
int *Y = X;
free(Y);
return 0;
}
您不需要也不能调用 free(X);
因为 X
指向与 Y
相同的点并且内存已经被 free(Y);
释放.
如果您希望 Y
指向与 X
不同的(新)事物,则需要为 Y
调用 malloc()
。在这种情况下,建议释放 X
和 Y
所指向的内容。
(释放将满足像 Valgrind 这样的检查器,但在现代 OS 中你不必在程序执行结束时释放东西,因为 OS 将释放你进程中使用的所有内存。有关更多信息,参见 c - What REALLY happens when you don't free after malloc? - Stack Overflow)
你不需要关心变量。你只需要关心分配的内存块。
您的代码没问题(除了缺少 headers)
您分配一个块并再次释放同一个块。就是这样。
如果您为 Y
添加另一个 malloc
,您将在分配 X
的值时导致内存泄漏。如果你添加 free(X)
你释放同一个块两次,这是非法的。
注意:您必须知道,在 free(Y)
之后,您将无法访问 *X
,因为内存不再属于您。
How should I free a malloc variable when it has been assigned to
another variable as well? (C Language)
您不需要释放声明的变量(指针)X
和 Y
。它们具有自动存储期限,当控件退出声明变量的范围时,将由编译器自动释放。
您需要释放此声明中动态分配的内存
int *X = (int *) malloc(sizeof(int));
内存已分配一次,也应释放一次,具体取决于有多少指针指向分配的内存。
在此声明之后
int *Y = X;
两个指针,X
和 Y
,现在指向分配的内存。
要释放分配的内存,您可以使用任一指针,例如
free( X );
或
free( Y );
在这样的调用之后,两个指针都是悬挂指针。通常将此类指针设置为 NULL
.
是个好主意
X = NULL;
Y = NULL;
抱歉,如果有人问过这个问题。
我有这个程序:
int main()
{
int *X = (int *) malloc(sizeof(int));
*X = 10;
int *Y = X;
free(Y);
return 0;
}
我不知道代码是否正确。我还需要像为 X
调用 malloc()
那样调用 free(X)
吗?我是否也需要为 Y
调用 malloc()
,或者 Y
就这样好吗?
此代码不正确,因为未包含所需的 header stdlib.h
并且未检查 malloc()
的结果。 malloc()
在 C 中的转换结果也是 discouraged.
正确的代码是:
#include <stdlib.h>
int main(void)
{
int *X = malloc(sizeof(int));
if (X == NULL) return 1;
*X = 10;
int *Y = X;
free(Y);
return 0;
}
您不需要也不能调用 free(X);
因为 X
指向与 Y
相同的点并且内存已经被 free(Y);
释放.
如果您希望 Y
指向与 X
不同的(新)事物,则需要为 Y
调用 malloc()
。在这种情况下,建议释放 X
和 Y
所指向的内容。
(释放将满足像 Valgrind 这样的检查器,但在现代 OS 中你不必在程序执行结束时释放东西,因为 OS 将释放你进程中使用的所有内存。有关更多信息,参见 c - What REALLY happens when you don't free after malloc? - Stack Overflow)
你不需要关心变量。你只需要关心分配的内存块。
您的代码没问题(除了缺少 headers) 您分配一个块并再次释放同一个块。就是这样。
如果您为 Y
添加另一个 malloc
,您将在分配 X
的值时导致内存泄漏。如果你添加 free(X)
你释放同一个块两次,这是非法的。
注意:您必须知道,在 free(Y)
之后,您将无法访问 *X
,因为内存不再属于您。
How should I free a malloc variable when it has been assigned to another variable as well? (C Language)
您不需要释放声明的变量(指针)X
和 Y
。它们具有自动存储期限,当控件退出声明变量的范围时,将由编译器自动释放。
您需要释放此声明中动态分配的内存
int *X = (int *) malloc(sizeof(int));
内存已分配一次,也应释放一次,具体取决于有多少指针指向分配的内存。
在此声明之后
int *Y = X;
两个指针,X
和 Y
,现在指向分配的内存。
要释放分配的内存,您可以使用任一指针,例如
free( X );
或
free( Y );
在这样的调用之后,两个指针都是悬挂指针。通常将此类指针设置为 NULL
.
X = NULL;
Y = NULL;