【问题标题】:Why should we nullify pointer after freeing memory by free()? [duplicate]为什么我们要在 free() 释放内存后清空指针? [复制]
【发布时间】:2011-06-19 04:47:33
【问题描述】:

可能重复:
Should one really set pointers to NULL after freeing them?

我已经使用 malloc 和 calloc 为指针分配了动态内存。使用此指针后,我应该释放内存,以便可以将块返回给操作系统(很好)。现在我的问题是,在释放块之后,我为什么要这样做:

pointer = NULL;

感谢您的帮助...

【问题讨论】:

标签: c pointers null


【解决方案1】:

这样我们就不会留下悬空指针。如果不清空未使用的指针,您将无法在以后检测指针是否可以安全地取消引用或释放。并且尝试取消引用或释放悬空指针会导致未定义的行为(=崩溃)。

【讨论】:

  • 只有运气好才会崩溃。最糟糕的是程序通常可以存活,但很难找到代码中的错误。
  • @ruslik,确实如此。尽管最终它会(几乎总是)崩溃。我只是想对 OP 做一个简单的解释 :-)
【解决方案2】:

因为如果你再次尝试free() 它会出现Undefined Behaviour

另外,注意free-ing之后,内存被程序回收了。不是操作系统。内存在程序执行结束后由操作系统回收。

【讨论】:

    【解决方案3】:

    如果指针变量仍在作用域内,您以后无法确定它是否存储了有效地址,并且如果您尝试使用该指针,则会遇到未定义的行为。

    free() 之后将指针设置为空是一种保护措施。如果您知道指针将在free() 之后很快超出范围,则不需要此操作:

    if( ... ) {
        void* ptr;
        ptr = malloc( ... );
        //use the buffer;
        free( ptr );
        ptr = 0; //not actually needed
    }
    

    但与此同时,大多数编译器会看到,在这种情况下,将指针设置为 null 并没有明显的效果并优化该代码。

    【讨论】:

      【解决方案4】:

      更好,因为:

      首先,它使您的代码更简单。当你管理内存时,你会花很多时间在mallocfree 上。如果将其设置为 NULL,则可以执行以下操作:

      int *pMyInteger;
      
      /* in init code */
      
      pMyInteger = (int *) malloc(42);
      
      /* use pMyInteger */
      
      free(pMyInteger);
      pMyInteger = NULL;
      
      /* somewhere else you have to change the size */
      
      free(pMyInteger);
      pMyInteger = (int *) malloc(42 * 10000);
      

      真的很简单,不是吗?

      其次,在调试器中发现 NULL (0) 指针也比发现悬空指针更容易。在调试器中看到0x0很容易猜到是指针管理问题。看到0xbac765就更难了:)

      my2c

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        • 2011-10-28
        • 2010-12-18
        • 1970-01-01
        • 2016-10-19
        • 1970-01-01
        相关资源
        最近更新 更多