在 C 语言中,变量的内存可以在 栈(stack)或 堆(heap)中分配。
malloc、calloc、realloc 动态分配内存,并通过 free 手动释放。内存量受系统能力限制,但访问速度较慢,并且手动控制释放内存。何时使用栈:
何时使用堆:
// 在栈中 int arr[10]; // 在堆中 int* parr = malloc(sizeof(int) * 10); // 别忘了释放内存 free(parr);
问题: 如果对通过 malloc 分配的数组没有调用 free 函数,会发生什么?
答案: 将发生内存泄漏 (memory leak)。动态分配的内存不会自动释放,随着时间的推移,这可能导致应用程序或整个系统的内存耗尽。
void leak() { int* leakArr = malloc(100 * sizeof(int)); // 没有调用 free(leakArr),内存丢失 }
故事
在一个项目中,程序员通过 malloc 为描述用户会话的结构分配内存,但忘记在会话结束时调用 free。结果,项目在几天内发生了内存泄漏,服务器因内存不足而“崩溃”。该问题仅在使用 Valgrind 进行性能分析并修复所有遗漏的 free 之后得以解决。
故事
开发人员在栈中为临时计算分配了一个大数组(最大 10 MB)。在栈小的服务器上,这导致应用程序因 stack overflow 错误而崩溃。经过分析,必须将缓冲区转移到堆中。
故事
一位开发人员决定将长字符串保存在栈中,但字符串的大小由用户主观指定。当输入非常长的字符串时,应用程序因内存访问错误而崩溃。最终决定将输入的数据转移到堆中并检查长度。