为什么下面的代码没有给出双重自由错误?

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)

dbu*_*ush 6

没有人承诺双重free会导致分段错误.

手册页:

free()释放指向的内存空间ptr,该内存空间必须由之前的调用返回malloc(),calloc()或者realloc(). 否则,或者如果 free(ptr) 之前已经调用过,则会发生未定义的行为. 如果ptrNULL,则不执行任何操作.

未定义的行为意味着无法保证将会发生什么.您的程序可能会崩溃,它可能会出现奇怪的行为,或者(如您所见)它可能看起来正常工作.对代码进行看似无关的更改可以更改未定义的行为如何显示自身,因此可能会崩溃或者可能会停止崩溃.

编辑:

正如Toby所建议的那样,通过Valgrind等工具运行程序,可以专门针对这些类型的错误进行额外的检查,并准确地告诉您出错的地方.

但是,如果没有这样的工具,如果你调用未定义的行为,所有的赌注都会被取消.