C语言 释放返回变量内存的正确方法



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

这是代码:

char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;
while((c = getchar()) != 'n' && c != EOF) {
    input[i++] = c;
}
return input;

我是否应该返回输入的地址并在使用后释放它?

好奇释放输入变量的最合适方法。

这很简单,只要你传递给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] = ''; /* 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: %sn", input);
     /* now you can free it */
     free(input);
     return 0;
  }

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

free(input + n);

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

但是你的代码,还有其他你应该处理的问题

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

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

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

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

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

首先;你没有办法以可执行的方式传达自由需求(即编译器或运行时不能帮助你 - 与指定参数类型相反)。您只需要将其记录在某个地方,并希望来电者已阅读您的文档

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

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

相关内容

  • 没有找到相关文章