gpt4 book ai didi

c - 为什么下面的代码没有给出双重释放错误?

转载 作者:行者123 更新时间:2023-12-02 06:22:00 24 4
gpt4 key购买 nike

当我在同一个指针上连续执行两次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;
}

最佳答案

没有 promise 双重free会导致段错误。

来自man page :

free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is NULL, no operation is performed.

Undefined behavior意味着无法保证将会发生什么。您的程序可能会崩溃,可能会表现出奇怪的行为,或者(如您所见)它可能看起来工作正常。对代码进行看似无关的更改可能会改变未定义行为的表现方式,因此它可能会开始崩溃,也可能会停止崩溃。

编辑:

按照 Toby 的建议,通过 Valgrind 等工具运行程序会专门进行额外的检查来查找这些类型的错误,并准确地告诉您哪里出了问题。

但是,如果没有这样的工具,如果您调用未定义的行为,那么一切都将失败。

关于c - 为什么下面的代码没有给出双重释放错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41147878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com