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

时间:2019-03-15 16:33:00

标签: 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());
    ...
}

1 个答案:

答案 0 :(得分:3)

  

进程终止时分配给指针缓冲区的内存是否自动释放?

这取决于。在大多数现代台式机和服务器上,可以。在某些较旧的系统或某些现代奇数球上,不一定。最佳实践是,无论程序退出时操作系统如何运行,都必须自己清理。

语言标准没有指定动态内存的确切管理方式以及程序退出后发生的一切,这完全是程序运行所在平台的功能。

通常,应将所有动态内存指针保存在某处,以便可以根据需要执行一些清理。另外,始终检查malloccallocrealloc的结果。不要盲目地假设他们总是成功的。