在下面的代码中,我是否需要"释放"指向使用 malloc 分配的内存区域的指针?释放主要指针还不够吗?
char * parentArray = malloc( 10 * sizeof(char));
char * miniArray = &parentArray [1];
free(myArr);
// free(miniArray) ?
在您的代码中,parentArray
是 malloc
返回的值,这是需要传递给 free
的值。C 中执行动态内存分配的函数族有:malloc
、calloc
和 realloc
。对未由这些函数之一返回的值调用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
将是未定义的行为。
-
parentArray
引用由malloc()
分配的动态内存;你的代码片段不做任何其他事情。 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