恢复变量的自由记忆的正确方法

w m*_*w m 15 c memory malloc free

我创建了一个旨在获取用户输入的函数.它要求将内存分配给保存用户输入的变量; 但是,该函数在函数结束时返回.释放已分配内存/返回变量值的正确方法是什么?

这是代码:

char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;

while((c = getchar()) != '\n' && c != EOF) {
    input[i++] = c;
}

return input;
Run Code Online (Sandbox Code Playgroud)

我应该返回输入地址并在使用后将其释放吗?

对于释放输入变量的最合适方法感到好奇.

Iha*_*imi 16

它很简单,只要你传递给它free()返回的相同指针malloc()就好了.

例如

char *readInput(size_t size)
 {
    char *input;
    int   chr;
    input = malloc(size + 1);
    if (input == NULL)
        return NULL;
    while ((i < size) && ((chr = getchar()) != '\n') && (chr != EOF))
        input[i++] = chr;
    input[size] = '\0'; /* nul terminate the array, so it can be a string */
    return input;
 }

 int main(void)
  {
     char *input;
     input = readInput(100);
     if (input == NULL)
         return -1;
     printf("input: %s\n", input);
     /* now you can free it */
     free(input);
     return 0;
  }
Run Code Online (Sandbox Code Playgroud)

你永远不应该做的事情是这样的

free(input + n);
Run Code Online (Sandbox Code Playgroud)

因为input + n不是指针返回malloc().

但是您的代码还有其他问题需要注意

  1. 您分配的空间MAX_SIZE char这么你应该乘sizeof(char)哪是1的,而不是sizeof(char *)这将分配MAX_SIZE指针,你也可以做MAX_SIZE一个函数的参数代替,因为如果你分配一个固定的缓冲区,你可以在定义数组main()与大小MAX_SIZE一样char input[MAX_SIZE],并将其传递给readInput()参数,从而避免malloc()free().

  2. 你正在分配那么多空间,但是你不能阻止while循环中的溢出,你应该验证它i < MAX_SIZE.


pm1*_*100 6

这是一个经典的c案例。函数为其结果分配内存,调用者必须释放返回值。您现在正走在 c 内存泄漏的如履薄冰之上。2个原因

第一的 ; 您无法以可执行的方式传达自由要求(即编译器或运行时无法帮助您 - 与指定参数类型相反)。您只需将其记录在某处并希望调用者已阅读您的文档

其次:即使调用者知道要释放结果,他也可能会犯错误,但会采取一些不会释放内存的错误路径。这不会立即导致错误,一切似乎都正常,但运行 3 周后,您的应用程序会因内存不足而崩溃

这就是为什么这么多“现代”语言都关注这个主题,C++ 智能指针、Java、C# 等垃圾收集,...


orl*_*rlp 5

您可以编写一个返回类型为char*return的函数input,并要求用户在free处理完数据后调用。

您还可以要求用户自己传入一个适当大小的缓冲区,连同缓冲区大小限制,并返回写入缓冲区的字符数。