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());
    ...
}
4

1 回答 1

3

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

这取决于。在大多数现代台式机和服务器上,是的。在某些较旧的系统或某些现代古怪的系统上,不一定。最佳做法是始终在您自己之后进行清理,而不管您的程序退出时操作系统会做什么。

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

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

于 2019-03-15T18:33:20.483 回答