我是 C 新手。众所周知,堆栈内存中的变量会在函数结束后释放。但在我的测试中,它没有被释放并且占用了内存。
这个例子很清楚:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
void run() {
printf("Start test. Memory usage in task manager: 504KB \n");
sleep(5);
char buf1[3145728];
memset(buf1, 'x', 3145728);
printf("buf1 Present. Memory usage in task manager: 3.9MB \n");
sleep(10);
return;
}
int main() {
run();
printf("run() ends. But memory usage in task manager is still: 3.9MB \n");
sleep(10);
char buf2[3145728];
memset(buf2, 'y', 3145728);
printf("buf2 Present. Memory usage in task manager: 7.0MB \n");
sleep(15);
return 0;
}
我认为,run()函数之后的内存使用量应该回到最初的水平,但似乎变量没有被释放并保留在内存中。
我错了吗?
更多详细信息:
- 我写 sleep 是为了有时间看看任务管理器。
- 我使用了
gcc
编译器。
最佳答案
首先不要太相信任务管理器。不太准确。
另一件事是编译器有一个你并不完全了解的分配策略。
It is famous that variables in stack memory be released after function ends.
“著名”的是,您不应该在局部变量上创建引用并存储/返回它,否则它可能会超出范围。
如果您在该函数上循环,或者创建另一个占用大致相同数量(或更少)堆栈的函数,然后立即调用它,您会注意到内存没有增加.
这是因为编译器运行时不会自动调整堆栈大小。它只是保留下次分配的空间(这是堆栈大小和容量之间的区别)。不存在“内存泄漏”。您甚至可以配置可执行文件(在链接阶段,以及在 Windows 上使用 EDITBIN
等工具)在启动时预分配所有堆栈,以避免调整大小和内存移动。
关于c - 看来基于堆栈的变量在 C 函数之后没有被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53275254/