根据我的理解,下面的程序可能已经崩溃,因为释放了已经释放的内存,但它没有。在我的Linux机器上运行。
#include <stdio.h>
#include <malloc.h>
int main(void) {
int *ptr1 = NULL;
ptr1 = malloc(100);
free(ptr1);
free(ptr1);
printf("%d\n", *ptr1);
return 0;
}发布于 2017-06-04 02:24:49
根据free的定义,双重free实现了未定义的行为:
7.20.3.2免费函数
free函数使ptr指向的空间被释放,即可用于进一步的分配。如果ptr为空指针,则不会发生任何操作。否则,如果参数与之前由calloc、malloc或realloc函数返回的指针不匹配,或者如果空间已通过调用free或realloc释放,则行为为undefined。
而未定义的行为本身在相同的标准中定义如下:
3.4.3 (1)未定义的行为
在使用不可移植或错误的程序构造或错误数据时的行为,本国际标准对此没有任何要求注意可能的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特有的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(通过发出诊断消息)
因此,具有未定义行为的程序可能会“崩溃”,但也可能不会。它还没有定义..。
https://stackoverflow.com/questions/44346793
复制相似问题