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());
...
}
当进程终止时,分配给指针缓冲区的内存是否自动释放?
这取决于。在大多数现代桌面和服务器上,是的。在一些较旧的系统,或一些现代的古怪的,不一定。无论操作系统退出时操作系统执行什么操作,最佳做法是始终自行清理。
究竟如何管理动态内存,以及程序退出后发生的事情,语言标准没有指定 - 这完全取决于程序运行的平台。
通常,您应该将所有动态内存指针保存在某处,以便您可以根据需要执行一些清理。另外,请务必查看malloc
,calloc
或realloc
的结果。不要盲目地认为他们总能成功。