需要显式调用free()的C函数

时间:2017-10-07 18:21:22

标签: c memory-management malloc free

我想知道所有在内部使用malloc()的C标准函数,并返回指向新分配的内存块的指针。 AFAIK有:

  • 的strdup()
  • GETCWD()
  • get_current_dir_name()
是吗?我正在编写一个复杂的解析器,它将所有C原始指针更改为更精细的C ++智能指针,我需要知道这可以自动完成。

3 个答案:

答案 0 :(得分:5)

列表是:

  • malloc
  • calloc
  • realloc
  • aligned_alloc(C11中的新内容)

您列出的所有功能都不是标准C.

答案 1 :(得分:1)

您的列表相当正确,但strdupgetcwd是POSIX(在C99中未标准化),get_current_dir_name是GNU(甚至不是POSIX)。

您将找到其他函数返回一些堆分配的数据。

但是你总是应该在使用它之前阅读某些功能的文档。它将告诉您返回的值是否为堆分配(以及应该如何释放)。

某些函数采用指针的地址并可能会更改它。例如getline(3)(POSIX)或asprintf(3)open_memstream(3)(某些分配甚至可能会发生以后)。

BTW一些​​标准函数如fopen可能正在使用堆分配的内存(在fclose时间释放)。

同样,对于您自己的库,请将它们记录得足够好,以便明确告诉谁负责free - g(或者另外破坏)每个堆分配的指针。即使是您自己的私人功能,也请在评论中记录。

自动检测与动态堆内存分配相关的功能很困难,在一般情况下可能无法可靠地执行(参见Rice's theorem),因此做了一个有趣的研究项目。

答案 2 :(得分:1)

  1. void* malloc (size_t size);
  2.   

    分配大小字节的内存块,返回指向块开头的指针。

    1. void* realloc (void* ptr, size_t size);
    2.   

      更改ptr。

      指向的内存块的大小
      1. void* calloc (size_t num, size_t size);
      2.   

        为num个元素数组分配一个内存块,每个元素的大小都是字节长,并将其所有位初始化为零。