0

我试图了解内存分配并在 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->stock,我是否必须释放 snode 和 slist_ptr?因为 tm 结构将用于程序的其余部分。如果我释放 snode 和 slist_ptr 会 tm struct 丢失值吗?

4

1 回答 1

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

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

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

如果您确实调用了 free on tm->stock,那么您将释放与初始相关的空间realloc(确保您的意思是realloc而不是malloc),但由于mallocfor ,您仍然会泄漏slist_ptr

于 2013-11-10T01:10:26.193 回答