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结构丢失值?
-
是的,当程序退出时,进程退出,并且OS回收分配给该进程的堆栈和堆空间。 想象一下,如果操作系统无法从崩溃的进程中收回未分配的内存,那将是多么糟糕!
-
作为一般的经验法则,对于程序中的每个
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_ptr
的malloc
,您仍然在泄漏。