【发布时间】:2019-04-15 22:43:23
【问题描述】:
我是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编译器。
【问题讨论】:
-
您正在对标准无法保证的事物做出假设。除了
sleep()和printf()之外的所有定义和语句都可以优化掉,因为它们不参与程序的可观察行为。 -
sleep在这里不起作用,编译器在此之前分配自动内存。也许如果它是一个可变长度数组...... -
写sleep是为了有时间看看任务管理器。正因为如此:-)
-
你是如何检查内存是否被释放的?你的平台是什么?
-
也许操作系统正在为您正在使用的大堆栈进行写入时复制分配。并且这个内存没有被释放,所以你可以一遍又一遍地调用 run() 而不会重新分配。
标签: c memory memory-management memory-leaks