在堆上分配内存后调用free
的这两种变体之间有区别吗?
// variant 1
int* p1 = (int*) malloc(sizeof(int)*4);
free(p1);
//variant 2
int* p2 = (int*) malloc(sizeof(int)*4);
free(*p2);
*p2 = NULL;
是有区别的。
变量2无效。free
需要一个先前由malloc
、calloc
或realloc
返回的指针。*p2
是分配空间中的第一个int
。正如man free
所说,因此会发生未定义的行为(针对此特定情况调整了引用):
free()
函数释放[p1
]所指向的内存空间,该空间必须是由之前调用malloc()
,calloc()
或realloc()
返回的。否则,[…]未定义行为发生。
指出:
- 不强制转换
malloc
的结果
是。free(*p2)
无效
free
释放指定地址的内存。考虑一下:p1
的值是多少?它的值是malloc
返回的指针,因此p1
的计算结果是指向malloc
分配的内存的指针。
*p2
的值是多少?它的值是存储在p2
地址的整数。这可以是任何东西,它不太可能是一个有效的指针。因此,free
将尝试释放一个无效的内存地址,如果你幸运的话,你会得到一个段错误。
是的,有区别。第一种方法,在指向malloc
分配的内存的指针上调用是正确的。第二种方法,调用这种指针的解引用,试图释放一些任意的内存地址(使用指针所指向的值中保存的值),这是错误的。
free(p1);
当您将内存分配给p1
和free
时,这是有效的,因此没有问题。
free(*p2);
它不太可能是有效的,因为*p2
可能是一个有效的指针,也可能不是(它需要分配内存)。
对未使用malloc或类似方式分配内存的指针使用free()将导致错误。