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

我试图了解内存分配并在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 struct将用于程序的其余部分。 如果我免费使用snode和slist_ptr将tm结构丢失值?

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

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

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

如果您确实在tm->stock上免费调用,那么您将释放与初始realloc相关的空间(确保您的意思是realloc而不是malloc ),但由于slist_ptrmalloc ,您仍然在泄漏。