c - C 中的静态和动态内存何时分配和取消分配?

标签 c memory memory-management

我现在正在学习 C,并试图弄清楚 C 的内存管理是如何工作的。如果我错了,请纠正我,但据我所知:

静态内存分配 - 这发生在编译时。编译器分配静态内存所需的必要内存。

静态内存释放 - 当 block /函数完成运行(对于局部变量)或整个程序完成执行(对于全局变量)时,内存会自动释放。

动态内存分配 - 内存在运行时分配,因为此时输入的大小未知。

动态内存释放 - 执行 free() 时释放内存。

这对吗?我错过了什么吗?

最佳答案

C语言中有3种不同的存储期限:

  • static:变量的生命周期就是程序的生命周期。它在加载时分配(仅在编译时定义),并且仅在操作系统卸载程序时释放。静态变量是在任何函数外部声明的变量,以及具有 static 修饰符的局部变量(在函数或 block 中声明)
  • automatic:自动变量在 block (或函数)内声明,没有存储修饰符。它们的生命周期从 block 的开头开始,到 block 的末尾结束。它们通常在 block 的开头分配并在其末尾释放,但由于 if 规则,优化编译器可以更快地分配它们并稍后释放它们,例如,如果 block 位于循环内。
  • 动态:它们通过malloc手动分配,并且只能通过free释放

常见的实现使用系统堆栈来存储自动变量,使用内存池(询问操作系统何时需要更多内存)来存储动态变量,但这是一个实现细节

当使用多线程时,还有第四种存储时长:线程存储时长。这些变量是使用_Thread_local存储类修饰符声明的。它们的生命周期就是线程的持续时间,每个线程都有自己的副本。

对于常见的实现,它们的管理方式与静态变量相同:它们在创建线程时由操作系统分配,并在线程结束时回收(仍然由操作系统)。


关于您的措辞的一些评论:

Static memory allocation - this happens during compile time.

请注意,编译时间和加载时间是不同的。在构建时仅创建一个文件,并且仅在运行时由系统分配内存

Static memory deallocation - the memory is deallocated automatically when the block/function is finished running (for local variables)...

范围(本地与全局)和存储持续时间之间存在混淆。函数可以包含静态变量,这就是使用 static 关键字的原因之一

Dynamic memory allocation - the memory is allocated during run-time because the size of the input is unknown at this time

这是程序员使用动态内存的一个可能原因,但可能还有其他原因,例如因为这样代码会更干净。特别是,当您想用 C 语言模拟面向对象编程时,动态内存是一个很好的工具。

关于c - C 中的静态和动态内存何时分配和取消分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677400/

相关文章:

c - 生成具有随机边的图

c - 这个 C 函数语法是什么?

mysql - MySQL 客户端和 PDO 如何使用 fetch 方法接收大结果

c - Valgrind 无效写入大小 8

c++ - 这些所谓的 'disasters' 指针使用不当会导致什么?

iOS 自定义键盘扩展 - 内存限制

c - 非常基本的 C 语言 if 函数

swift - 分配手动分配的 UnsafeMutablePointer<String>

c - 衰减数组和内存释放

c - 如何告诉 `getchar()` 回到缓冲区的开头?