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?
}
4

3 回答 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
于 2015-11-23T16:04:28.527 回答
2

因为 X 不是在堆上分配的,所以你不能释放 p。要释放你必须使用 malloc、calloc 或 realloc。

同样,在第二部分中,变量再次在堆栈上,它将被自动清理。

于 2015-11-23T16:03:18.643 回答
2

第一个代码

这是未定义的行为。

N1256 7.20.3.2 自由功能

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

第二个代码

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

于 2015-11-23T16:04:15.690 回答