我想知道所有在内部使用malloc()并返回指向新分配的内存块的指针的C标准函数。AFAIK有:
- strdup()
- getcwd()
- get_current_dir_name()
就是这样吗?我正在编写一个复杂的解析器,它将把所有的C原始指针更改为更精细的C++智能指针,我需要知道在哪里不能自动完成。
列表为:
malloc
calloc
realloc
aligned_alloc
(C11新增)
您列出的功能都不是标准的C.
您的列表相当正确,但strdup
和getcwd
是POSIX(在C99中未标准化),get_current_dir_name
是GNU(甚至不是POSIX)。
您会发现其他函数返回一些堆分配的数据。
但是,在使用某个函数之前,您总是应该阅读该函数的文档。它将告诉您返回的值是否是堆分配的(以及应该由谁以及如何释放)。
有些函数获取指针的地址并可能更改它。例如getline(3)(POSIX)、asprintf(3)或open_memstream(3)。
顺便说一句,像fopen
这样的一些标准函数可能使用堆分配的内存(在fclose
时释放)。
同样,对于您自己的库,对它们进行充分的文档记录,以明确谁负责free
-in g(或以其他方式销毁)每个堆分配的指针。即使是你自己的私人活动,也可以在评论中记录下来。
自动检测与动态堆内存分配相关的函数是困难的,在一般情况下可能不可能可靠地完成(参见Rice定理),因此这是一个有趣的研究项目。
void* malloc (size_t size);
分配一个大小为字节的内存块,返回一个指向该块开头的指针。
void* realloc (void* ptr, size_t size);
更改ptr指向的内存块的大小。
void* calloc (size_t num, size_t size);
为num个元素的数组分配一块内存,每个元素的大小为字节长,并将其所有位初始化为零。