【发布时间】:2013-05-04 06:28:07
【问题描述】:
如果我定义一个结构...
struct LinkNode
{
int node_val;
struct LinkNode *next_node;
};
然后创建一个指向它的指针...
struct LinkNode *mynode = malloc(sizeof(struct LinkNode));
...然后最后 free() 它...
free(mynode);
...我仍然可以访问结构的“下一个节点”成员。
mynode->next_node
我的问题是:哪一部分底层机制会跟踪这个内存块应该代表结构 LinkNode 的事实?我是 C 的新手,我希望在我对指向我的 LinkNode 的指针使用 free() 之后,我将不再能够访问该结构的成员。我预计会出现某种“不再可用”警告。
我很想进一步了解底层流程的工作原理。
【问题讨论】:
-
你会期望内存在调用 free 时蒸发吗?是否仍然存在(或不存在),或者它可能具有不同的含义。
-
指针仍然具有相同的值。在调用 free() 之后你放弃了内存:你告诉 malloc/free 你不想再使用它了。将其与电话号码进行比较:在我退出电话附件后,我的号码不再有效。但是您仍然可以尝试拨打它。甚至可能是我在接电话。或噪音。或者完全不同的人。数字(=地址)仍然存在,但不再使用它。它可能指向核电站的控制...
-
Eric Lippert 的analogy 在这里很合适。
-
WRT 处理结构成员:检查(汇编器)输出
gcc -S以了解它们是如何工作的。p->next本质上翻译为p + some_offset。在p被释放之后,该代码(和偏移量)当然是相同的。但它是无效的,因为释放后,p不再引用有效对象。 -
还有一个额外的细节:在 c89/ANSI 之前(在一些/大多数 unix 平台上)它曾经是一个 要求 指针(或它曾经用来指向) 仍然可以在 free() 之后使用,因为没有干预 malloc/free 调用。
标签: c pointers memory-management struct