有用有还
堆存储器的优点就是可以占用它很长一段时间,缺点还是……可以占用它非常长的时间。
使用栈的时候,你无需操心归还存储器,因为这个过程是自动进行的。每当你离开函数,局部变量就会从栈中清除。
但堆完全不一样。一旦申请了堆上的空间,这块空间就再也不能分配出去,直到告诉C标准库你已经用完了。堆存储器的空间有限,如果在代码中不断地申请堆空间,很快就会发生存储器泄漏。
当程序不断地申请存储器,又不释放那些不再需要的存储器,就会发生存储器泄漏。存储器泄漏是C程序中最常见的错误,它们很难追踪。
调用free()释放存储器
malloc()
函数分配空间并给出一个指向这块空间的指针。你需要用这个指针访问数据,用完以后,需要用free()
函数释放存储器,就像把储物柜的钥匙还给服务员,好让别人能接着用。
每次在代码中用malloc()
函数请求堆存储,就应该有相应的代码用free()
函数归还存储空间。虽然程序结束以后,所有堆空间会自动释放,但用free()
显式释放你创建的所有动态存储器是一种好的做法。
看看malloc()和free()如何工作。