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



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

  • strdup()
  • getcwd()
  • get_current_dir_name()

就是这样吗?我正在编写一个复杂的解析器,它将把所有的C原始指针更改为更精细的C++智能指针,我需要知道在哪里不能自动完成。

列表为:

  • malloc
  • calloc
  • realloc
  • aligned_alloc(C11新增)

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

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

您会发现其他函数返回一些堆分配的数据。

但是,在使用某个函数之前,您总是应该阅读该函数的文档。它将告诉您返回的值是否是堆分配的(以及应该由谁以及如何释放)。

有些函数获取指针的地址并可能更改它。例如getline(3)(POSIX)、asprintf(3)或open_memstream(3)。

顺便说一句,像fopen这样的一些标准函数可能使用堆分配的内存(在fclose时释放)。

同样,对于您自己的库,对它们进行充分的文档记录,以明确谁负责free-in g(或以其他方式销毁)每个堆分配的指针。即使是你自己的私人活动,也可以在评论中记录下来。

自动检测与动态堆内存分配相关的函数是困难的,在一般情况下可能不可能可靠地完成(参见Rice定理),因此这是一个有趣的研究项目。

  1. void* malloc (size_t size);

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

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

更改ptr指向的内存块的大小。

  1. void* calloc (size_t num, size_t size);

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

相关内容

  • 没有找到相关文章

最新更新