悬挂指针示例的混淆

3
为什么下面的例子不正确?为什么它不能展示一个悬空指针?我的老师说它并没有展示悬空指针。提前感谢!
int X = 32;
int *p = &X;
free(p);
*p = 32; //<------Shouldn't this line cause dangling pointer ???

同样的问题也出现在这里。为什么下面的示例没有展示出内存泄漏

void function(int x){
   int *p = &x;
   *p = 32;
   //shouln't this code show a warning as p was not freed?
}

3
你正在试图释放位于栈上的内存。内存泄漏发生在自由存储区(堆)上。 - ForeverStudent
请先阅读free()手册页 - Sourav Ghosh
在第一个例子中,这行代码 free(p); 是错误的,因为 'p' 没有通过调用 malloc()calloc()realloc() 来设置。 - user3629249
未能释放一些已分配的内存不会导致编译器发出警告/错误。然而,某些工具,例如valgrind将引发错误。但是,获取某个东西的地址并不分配内存。建议与您的讲师交谈,以了解有关分配/释放内存和堆栈上的值的澄清。 - user3629249
3个回答

4

引用维基百科:

在计算机编程中,悬空指针和野指针是指不指向适当类型的有效对象的指针。

此外,你只应该释放由malloc或类似分配函数分配的内存-似乎这是两种情况下你混淆的原因。基本上,你的例子都不需要free

悬空指针的一个例子是:

{
   char *ptr = NULL;

   {
       char c;
       ptr = &c;
   } 
     // c falls out of scope 
     // ptr is now a dangling pointer 
}

此外,如果您有这样的例子:

例如:

int *p = malloc(sizeof(int));
*p = 9;
free(p); // now p is dangling

2

因为X并未在堆上分配,所以您不能释放p。要释放,必须使用malloc,calloc或realloc。

同样地,在第二部分中,变量也在堆栈上,将自动清除。


2

第一段代码

这是未定义的行为。

N1256 7.20.3.2 free函数

如果ptr是空指针,则不会执行任何操作。否则,如果参数与之前由calloc、malloc或realloc函数返回的指针不匹配,或者如果空间已经被free或realloc调用释放,则行为未定义。

第二段代码

这段代码本身不会导致内存泄漏,因为它没有丢弃任何分配的缓冲区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接