ANSI C动态内存分配以及何时应该释放内存

时间:2013-11-10 01:00:46

标签: c malloc free ansi

我试图了解内存分配并在ANSI C中释放它们。问题是我不知道何时释放它们。

1)程序是否自由退出已分配的内存本身(即使我没有通过free()执行此操作)?

2)假设我的代码是这样的:(请不要担心这些结构的完整代码。我只关注逻辑)

snode = (stock_node *) realloc(snode, count * sizeof(stock_node));
struct stock_list slist = { snode, count };
stock_list_ptr slist_ptr = (stock_list_ptr) malloc(sizeof(stock_list_ptr));
slist_ptr = &slist;
tm->stock = slist_ptr;

如此; snode转到stock_list,stock_list转到slist指针,然后转到tm-> stock。

现在,由于我已经将所有这些分配给tm->库存,我是否必须免费使用snode和slist_ptr?因为tm struct将用于程序的其余部分。如果我免费使用snode和slist_ptr将tm结构丢失值?

1 个答案:

答案 0 :(得分:1)

  1. 是的,当程序退出时,进程退出,操作系统回收分配给该进程的堆栈和堆空间。想象一下,如果操作系统无法从崩溃的进程中收回未分配的内存,那将是多么糟糕!

  2. 作为一般经验法则,对于程序中的每个malloc()(或calloc()或 - 有警告 - realloc()),应该有相应的{{1 }}。简而言之,您需要在某个时候释放与free()相关联的空间和与snode相关联的空间。

  3. 在这个特定的例子中,你实际上已经设法为自己创建了内存泄漏。为slist_ptr执行malloc()时,为该指针分配了4个字节(64位为8个字节)。在下一行,您重新指定slist_ptr以指向slist_ptr的位置,这意味着您不再指向为slist分配的空间。

    如果您在slist_ptr上免费拨打电话,则可以释放与初始tm->stock相关的空间(确保您的意思是realloc而不是realloc),但是由于malloc的{​​{1}},您仍然在泄露。