c - 静态动态内存是否会在程序结束时自动释放?

标签 c memory memory-leaks dynamic-memory-allocation static-memory-allocation

static 关键字使指针保持事件状态直到程序终止,但是分配给指针 buffer 的内存是否会在进程终止时自动释放?还是程序员必须这样做?


在下面的例子中,我们不知道该函数将被调用多少次,如果我们在当前函数调用时没有读取任何内容,我们只能释放分配的内存。否则无法释放内存,因为我们将需要在下一次调用中使用刚刚读取的字节。


函数:

char *readStdin(void) {
    static char *buffer = NULL;
    ssize_t ret;

    if (buffer != NULL) {
        // DO SOMETHING WITH PREVIOUSLY READ BYTES
    }
    /* Allocate and NULL-terminate a Buffer */
    buffer = malloc(BUFSIZ);
    if (buffer == NULL)
        return (NULL);
    buffer[BUFSIZ] = '\0';

    /* Read from Standard Input at most 'BUFSIZ' characters*/
    ret = read(0, buffer, BUFSIZ);

    /* Free Buffer if no Input Read */
    if (ret <= 0) {
        free(buffer);
        buffer = NULL;
    }

    /* Return the read Input */
    return (buffer);
}

程序:

int main(void) {
    /* Print the Read Bytes */
    printf("%s", readStdin());
    printf("%s", readStdin());
    printf("%s", readStdin());
    ...
}

最佳答案

is the memory allocated to the pointer buffer free'd automatically when the process terminates ?

这取决于。在大多数现代台式机和服务器上,是的。在一些较旧的系统或一些现代的古怪系统上,不一定。最佳做法是,无论程序退出时操作系统做什么,都要自己清理。

动态内存的确切管理方式,以及程序退出后动态内存会发生什么,语言标准并未指定 - 这完全取决于您的程序运行的平台。

通常,您应该将所有动态内存指针保存在某处,以便您可以在必要时执行一些清理工作。此外,总是检查malloccallocrealloc 的结果。不要盲目地假设他们总是成功的。

关于c - 静态动态内存是否会在程序结束时自动释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55186992/

相关文章:

ruby-on-rails - ActionMailer 中的内存泄漏

cocoa-touch - 在 IOS4.0 中使用 UIWebView 加载请求时发生内存泄漏

这段代码可以优化吗?

c - 二叉搜索树insert方法返回指向节点的指针

c++ - 无效、无效、C 和 C++

c# - 为什么 C 和 C++ 中的 float / double 没有除余运算?

spring - Tomcat - PermGen 空间异常

c++ - 执行被信号 11 终止(可以通过违反内存限制触发)

c++ - 我的动态数组模板类在做奇怪的事情

ios - 为什么 ARC 在 popViewController 之后不释放内存