繁体   English   中英

ANSI C动态内存分配,什么时候才应该释放内存

[英]ANSI C Dynamic Memory Allocation and when exactly we should free the memory

我试图绕过内存分配并在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 struct是否会丢失值?

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

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

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

如果确实调用了tm->stock free,则可以释放与初始realloc相关联的空间(请确保您的意思是realloc而不是malloc ),但是由于slist_ptrmalloc ,您仍然在泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM