【发布时间】:2010-04-14 10:25:27
【问题描述】:
这是释放单链表内存的 C 代码。它是用 Visual C++ 2008 编译的,代码可以正常工作。
/* Program done, so free allocated memory */
current = head;
struct film * temp;
temp = current;
while (current != NULL)
{
temp = current->next;
free(current);
current = temp;
}
但我也遇到过(甚至在一本书中)这样写的相同代码:
/* Program done, so free allocated memory */
current = head;
while (current != NULL)
{
free(current);
current = current->next;
}
如果我用我的 VC++ 2008 编译该代码,程序会崩溃,因为我首先释放 current,然后将 current->next 分配给 current。但显然,如果我用其他一些编译器(例如,本书作者使用的编译器)编译这段代码,程序就会工作。所以问题是,为什么用特定编译器编译的这段代码可以工作?是不是因为那个编译器把指令放在二进制文件中,记住 current->next 的地址,尽管我释放了 current 而我的 VC++ 没有。我只是想了解编译器是如何工作的。
【问题讨论】:
-
请告诉我们这本书,以便我们避免它并推荐反对它。
-
C 入门(所有版本第 5、第 4.. 没有此错误的勘误表)查看此主题:bytes.com/topic/c/answers/212665-freeing-simple-linked-list
-
C 运行时会用某种模式填充已释放块的字节(MSVC 为 0xfeeefeee)。不过,这只发生在调试版本中,如果您在发布版本中尝试它,它很可能会起作用。这仍然是一种未定义的行为,请废弃任何推荐此行为的书。
标签: c++ c compiler-construction