我如何编写这个 C 函数,以便用户可以在以后不使用 "free" 的情况下调用它?

How can I write this C function so the users can call it without using "free" afterwards?

我是 C 编程的新手,有一个关于内存管理的基本问题。

我编写了以下代码(有效!)将一些 ASCII 字符编码为我需要的特定格式:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

const char *hexdigits = "0123456789ABCDEF";

/*
 * Each ASCII byte is encoded as two hexadecimal digits.
 */
char* makeHex (uint8_t* inputBuffer, int inputSize) {
    int i, j;
    char* compositionBuffer = (char*) malloc(inputSize*2 + 1);
    for (i = j = 0; i < inputSize; i++) {
        unsigned char c;
        c = (inputBuffer[i] >> 4) & 0xf;
        compositionBuffer[j++] = hexdigits[c];
        c = inputBuffer[i] & 0xf;
        compositionBuffer[j++] = hexdigits[c];
    }
    return compositionBuffer;
}

int main(void) {
  char a[] = "ABCD";
  uint8_t* inputBuffer = (uint8_t*) a;
  int inputSize = sizeof(inputBuffer);
  int q;
  for (q = 0; q < 10000; q++) {
    char* p = makeHex(inputBuffer, inputSize);
    puts(p); // This outputs "41424344" which is correct.
    free(p); // I am interested in this line
  }
}

现在,我希望能够执行此功能 不必每次都记住 运行 free(p)。如果我简单地删除该行,就会发生内存泄漏。

有人可以建议另一种编写方法,这样函数的用户就不需要关心内存管理了吗?

虽然在某些情况下您可能能够自动释放由 malloc() 分配的内存,但实际上对于 C 函数来说,return 是一个指针来要求调用者执行操作是完全典型的要清理的东西。 clean-up 可能是对 free() 的简单调用,如您的示例所示,或者如果它是具有复杂 clean-up 要求的数据结构,则它可能是某个特定函数。

如果您定义一个 return 是 char * 的函数,任何阅读代码的有经验的 C 程序员都会意识到调用者 可能 必须释放它。我会小心记录任何 不是 情况的实例。

实际上,如果函数 returned 指向不需要释放的对象,我会将 return 类型定义为 const。在这种情况下,数据 returned 很可能是调用者不应该操作的东西,如果我尝试释放 const 指针,编译器应该发出警告。

总之,放下烦恼,学会去爱free() ;)