[英]Freeing the memory arrays of structures in C
假定以下情况:
typedef struct {
int ID1;
int ID2;
char string[256];
} Reg;
我动态创建一个数组,此结构:
Reg *myReg = (Reg*) malloc(sizeof(Reg)*100); //array of type Reg with 100 positions.
在整个示例系统中,我填写了这个数组。
到了某个点,我不希望指针“ myReg”指向此向量。 我希望他指向NULL。 并且还要清除我所做的malloc占用的内存空间。
题:
如果我做:
free(myReg);
这将使myReg指向NULL并释放分配给我的空间吗?
free(myReg);
这将使myReg指向NULL并释放分配给我的空间吗?
它只会释放内存。 即使不阅读规范,如果您看一下如何声明free
函数,您也会发现它实际上无法更改指针所指向的内容。
/* Even if it wanted, `free` can't make `ptr` point to anything else. */
void free(void *ptr);
调用free仅释放分配的内存,并将其返回到堆。 不会将myReg设置为NULL。 您必须自己做。
一种方法是编写如下的宏:
#define MY_FREE(ptr) free(ptr); ptr = NULL;
其他答案是正确的。
为了帮助理解为什么必须这样做,请考虑可能有多个指针指向该内存或指向该内存的不同部分:
Reg *myReg = (Reg*) malloc(sizeof(Reg)*100);
Reg *myReg2 = myReg;
Reg *myReg3 = &myReg[50];
当释放myReg
,所有这些指针均不变。 它们指向与以前相同的内存,但是该内存不再可用。
您,程序员,应该将它们设置为NULL(或者只是避免免费使用它们)。
C找不到它们全部并将它们设置为NULL。 诸如Java之类的更现代的语言知道如何跟踪指向给定对象的所有指针,但是C却没有这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.