记忆腐败

Vij*_*jay 2 c coredump memory-leaks

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

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

基本上我释放已经被释放的记忆.我认为应该导致核心转储!!是不是这样?

但它正在印刷

pointer is freed!!
Run Code Online (Sandbox Code Playgroud)

我错了一些在哪里?

Tor*_*dek 7

根据手册页,"如果之前已经调用过free(ptr),则会发生未定义的行为."

它不需要爆炸; "不做任何事情"是完全可以接受的未定义行为.也是鼻子恶魔.不要依赖它.


Alo*_*hal 7

您的计划存在多个问题:

  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()成功地使用指针,调用free()它就是未定义的行为:程序可以做任何事情,包括(不幸的是),似乎没有做任何坏事.我说"不幸",因为它可能会给你一种安全感,free()指针可以不止一次.