c - 内存损坏



memory-leaks core (5)

我正在运行一个小型的C程序:

#include<stdio.h>
int main()
{
char *p;
p = (char *)malloc(10);
free(p);
free(p);
free(p);
printf("\npointer is freed!!\n");
}

基本上我释放了已经释放的内存。 我认为应该导致核心转储!!是不是这样?

但它是印刷的

pointer is freed!!

我错了一些在哪里?

https://ffff65535.com


只是添加到其他答案,我想指出的是,如果您将指针设置为NULL,然后调用free(),行为将不会再被定义。 这几乎是一个没有操作。 但是,如果指针被释放,并且在指针指向另一个位置(甚至是NULL)之前再次调用free(),则不能确定发生了什么。 这可能会导致在某些实现上发生核心转储,而其他一些实现则不会发生。


堆腐败不需要立即引起问题。 可能发生的情况是释放的内存(或内存的一部分)用于分配其他结构,然后可能会导致问题。 free记忆不止一次始终是UB(未定义),即使您在此刻没有看到邪恶效果,也不应该这样做。


您的程序有多个问题:

  1. 由于您使用的是malloc()free() ,所以在调用这些函数之前,应该先执行#include <stdlib.h>
  2. 不需要从malloc()返回返回值:它返回一个void * ,它可以安全地分配给任何其他指针类型(函数指针除外)。 所以,你可以这样做: p = malloc(10);
  3. 一旦释放由malloc()realloc()分配的指针,以任何方式使用指针值都是不好的:特别是,不能再对其调用free()
  4. int main()最好写成int main(void)
  5. 由于main()返回int ,所以你应该从中返回一个值。 传统上,0表示成功。

当然,你的程序的主要问题(不是双关语)会解放多次,但上面提到的其他问题也很重要。 成功free() 'da指针后,对其调用free()就是未定义的行为:程序可以做任何事情,包括(不幸的是), 看起来不会做任何坏事 。 我说“不幸”,因为它可能会给你一种安全感,可以多次free()一个指针。


我期望大多数编译器的DEBUG版本能够检测到这种类型的故障,并准确报告发生了什么。 所以MSVC会这样做。

在RELEASE中,它可以被优化以更快地产生不可预知的行为。


释放已经释放的内存,导致未定义的行为,你很幸运,在这种情况下,在其他时候,你可能会得到你的核心转储





coredump