c - 看来基于堆栈的变量在 C 函数之后没有被释放

标签 c memory memory-management memory-leaks

我是 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/

相关文章:

c - "do { free(x); x = NULL; } while (0);"和 "{ free(x); x = NULL; }"有什么区别

c - 如果链接到它们的 fd 用于其他目的,FILE * 是否继续工作?

c - 即使我释放了每个 malloc,动态结构数组和链表中的内存泄漏

.net - .NET CLR 上长时间运行的模拟应用程序

linux - 如何从任意地址读取一定大小的内存并将其内容写入文件?

c++ - C++ 放置删除在内部如何工作(C++ 运行时)?如何克服它的局限性?

memory-management - JVM-如何查找和比较哪个 JVM 更适合 Linux? JAMVM 与 OPENJDK。

c - 如何使用 libc 正确设置进程优先级限制?

c - 我用 c 语言做了一个计算器,当我尝试运行它时会弹出错误

c++ - 在 C++ 中处理类间内存释放