Gop*_*hna 2 c undefined-behavior
当我free()在同一个指针上连续执行两次时,它会产生双重自由错误,但是当我尝试释放两次相同的指针时,我释放了其他指针,它没有给出错误.
#include <stdio.h>
#include <stdlib.h>
int main (){
long int*ptr;
int *ptr1;
ptr = malloc (1);
ptr1 = malloc (1);
printf ("%ld\n", ptr[-1]);
free (ptr);
printf ("%ld\n", ptr[-1]);
free (ptr1);
free (ptr);
free (ptr1);
free (ptr);
free (ptr1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
没有人承诺双重free会导致分段错误.
从手册页:
free()释放指向的内存空间ptr,该内存空间必须由之前的调用返回malloc(),calloc()或者realloc(). 否则,或者如果free(ptr)之前已经调用过,则会发生未定义的行为. 如果ptr是NULL,则不执行任何操作.
未定义的行为意味着无法保证将会发生什么.您的程序可能会崩溃,它可能会出现奇怪的行为,或者(如您所见)它可能看起来正常工作.对代码进行看似无关的更改可以更改未定义的行为如何显示自身,因此可能会崩溃或者可能会停止崩溃.
编辑:
正如Toby所建议的那样,通过Valgrind等工具运行程序,可以专门针对这些类型的错误进行额外的检查,并准确地告诉您出错的地方.
但是,如果没有这样的工具,如果你调用未定义的行为,所有的赌注都会被取消.