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

问题描述 投票:1回答:1

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());
    ...
}
c memory memory-leaks dynamic-memory-allocation static-memory-allocation
1个回答
3
投票

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

这取决于。在大多数现代桌面和服务器上,是的。在一些较旧的系统,或一些现代的古怪的,不一定。无论操作系统退出时操作系统执行什么操作,最佳做法是始终自行清理。

究竟如何管理动态内存,以及程序退出后发生的事情,语言标准没有指定 - 这完全取决于程序运行的平台。

通常,您应该将所有动态内存指针保存在某处,以便您可以根据需要执行一些清理。另外,请务必查看malloccallocrealloc的结果。不要盲目地认为他们总能成功。

© www.soinside.com 2019 - 2024. All rights reserved.