理解内存管理,第 1 部分:C

这是一篇关于内存管理的系列文章的第一部分,主要介绍了在 C 语言中手动进行内存管理的过程,包括文件读取、排序、打印结果和清理等步骤,同时也提到了一些可能出现的问题和相关的内存管理机制,如malloc()free()等。

主要观点

  • 在 C 语言中,需要手动进行内存管理,包括分配和释放内存。
  • 内存分为栈和堆,栈用于存储固定大小的数据,堆用于存储任意大小的数据。
  • malloc()用于在堆上分配内存,free()用于释放堆上的内存。
  • 手动内存管理容易出现内存泄漏和使用后释放等问题。

关键信息和重要细节

  • 文件读取:使用fopen()打开文件,fgets()逐行读取文件内容,存储在line缓冲区中。如果line缓冲区不够大,可能会导致读取错误。使用malloc()realloc()动态分配内存来存储读取的行。
  • 排序:使用qsort()函数对存储行的指针数组进行排序,按照字符串的字典序排序。排序过程中只改变了指针的顺序,实际的字符串内容不变。
  • 打印结果:C 语言中字符串以\0结尾,通过遍历存储行的指针数组,逐个打印字符串内容。
  • 清理:在函数结束时,需要释放使用malloc()分配的内存,以避免内存泄漏。先释放存储行的内存,再释放存储行指针数组的内存。
  • malloc()工作原理malloc()从操作系统获取大块连续的内存,分配内存时选择第一个可用的区域。释放内存后,可能会产生内存碎片,导致后续分配困难。malloc()通过保留部分内存用于元数据来管理已分配和未分配的区域。
  • 多个引用和使用后释放(UAF):如果在释放内存后继续使用指向该内存的指针,可能会导致 UAF 错误,程序的行为是未定义的。

总结:通过一个简单的程序示例,详细介绍了 C 语言中手动内存管理的过程和相关机制,以及可能出现的问题,为后续介绍 C++等语言的内存管理提供了基础。

阅读 5
0 条评论