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 结构将在程序的其余部分使用。如果我释放节点并且slist_ptr tm 结构会丢失值吗?

    是的,
  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_ptr malloc,您仍然泄漏。

相关内容

  • 没有找到相关文章

最新更新