繁体   English   中英

释放C中的结构的内存数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM