C语言 在创建指向最初由 malloc 创建的区域的新指针时,我是否应该调用 free



在下面的代码中,我是否需要"释放"指向使用 malloc 分配的内存区域的指针?释放主要指针还不够吗?

char * parentArray = malloc( 10 * sizeof(char));
char * miniArray   = &parentArray [1];
free(myArr);
// free(miniArray) ? 

在您的代码中,parentArraymalloc 返回的值,这是需要传递给 free 的值。C 中执行动态内存分配的函数族有:malloccallocrealloc。对未由这些函数之一返回的值调用free或对同一值调用free两次是未定义的行为。

确实存在其他函数,例如调用malloc并返回结果的strdup,因此也必须释放这些指针。strdup的文档将告诉您这一点。一般来说,在编写 C 时,您必须了解谁负责分配和释放内存,并确保此"契约"有据可查。

char * miniArray   = &parentArray [1];

在这里,您不是在分配内存,而只是miniArray指向某个地址。

因此,没有必要为miniArray free

但是,取消

引用miniArray不应在free(parentArray)之后进行。这会导致未定义的行为,即你不应该这样做

*miniArray

稍后在代码中。

free()解除分配先前由malloc()calloc()realloc()分配的空间,否则行为是未定义的。

来自 C 标准##7.22.3.3p2

free 函数使 ptr 指向的空间被解除分配,即可用于进一步分配。如果 ptr 为空指针,则不会执行任何操作。否则,如果参数与内存管理函数之前返回的指针不匹配,或者空间已通过调用 free 或 realloc 解除分配,则行为是未定义的。

在代码片段中,parentArray使用 malloc() 分配内存 但在这里:

char * miniArray   = &parentArray [1];

miniArray指向parentArray的第一个元素的地址,该地址是有效内存,但不是malloc()返回的指针。因此,调用 free miniArray将是未定义的行为。

  1. parentArray引用由malloc()分配的动态内存;你的代码片段不做任何其他事情。
  2. malloc()calloc()realloc()提供的每个分配应释放一次且仅释放一次;对同一分配的多个引用只能释放一次。

举个简单的例子:

void *a=malloc(size); // a references heap mem allocation
void *b=a; // b references heap mem allocation
free(a);   // heap mem allocation freed
free(b);   // error: heap mem allocation already freed

最新更新