如何检查指针是否已在C中释放?

Kit*_*cha 28 c free pointers

我想检查指针是否已经释放.我如何使用gnu编译器设置?

Cha*_*had 31

你不能.跟踪这个的方法是将指针指向0或NULL释放它.然而正如Fred Larson所提到的,这对指向同一位置的其他指针没有任何作用.

int* ptr = (int*)malloc(sizeof(int));
free(ptr);
ptr = NULL;
Run Code Online (Sandbox Code Playgroud)

  • 我认为你还没有理解为指针分配NULL值的含义.执行此操作时,您将清除存储在指针中的地址,而不是指针中存储的地址的内容.这是一个很好的做法,因为它可以防止已经释放的指针被进一步使用,这可能会导致安全问题. (3认同)

cni*_*tar 27

你不能.只需NULL在它之后分配free它,以确保你没有释放它两次(没关系free(NULL)).

更好的是,如果可能的话,不要在你忘记"已经释放"的地方编写代码.

编辑

解释问题是如何找出指针所指向的内存是否已被释放:你不能这样做.你必须自己做簿记.

  • 不过,这有点回避了这个问题。给予OP怀疑的好处并将问题解释为“指针指向的内存是否已被释放”(您不释放指针,只释放内存),那么问题就变成“如何判断给定的指针是否已释放”值指向已释放的内存”。 (2认同)

ken*_*ytm 15

没有可靠的方法来判断指针是否已被释放,正如Greg评论的那样,释放的内存可能会被其他无关数据占用而你会得到错误的结果.

事实上,没有标准方法来检查指针是否被释放.也就是说,glibc确实有函数(mcheck,mprobe)来查找用于堆一致性检查的指针的malloc状态,其中一个是查看指针是否被释放.

但是,这些函数主要用于调试,并且它们不是线程安全的.如果您不确定要求,请避免使用这些功能.只要确保你配对malloc/ free.


示例http://ideone.com/MDJkj:

#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h>

void no_op(enum mcheck_status status) {}

int main()
{
    mcheck(&no_op);

    void* f = malloc(4);

    printf("%d (should be %d)\n", mprobe(f), MCHECK_OK);
    printf("%d (should be %d)\n", mprobe(f), MCHECK_OK);

    free(f);

    printf("%d (should be %d)\n", mprobe(f), MCHECK_FREE);
    printf("%d (should be %d)\n", mprobe(f), MCHECK_FREE);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*and 6

您可以通过编写为您分配指针的宏来扩展将NULL分配给指针值的概念。例如:

#define FREE(ptr) do{ \
    free((ptr));      \
    (ptr) = NULL;     \
  }while(0)
Run Code Online (Sandbox Code Playgroud)

然后,只要确保您的代码仅使用FREE()而不使用free(),您就可以确信自己编写的代码不会两次释放相同的内存。当然,这不会阻止多次调用释放内存的库函数。它并不能保证每个malloc都有一个免费的。

您可以使用函数来尝试此操作,但是它变得笨拙,因为您必须抛出引用运算符,而且它看起来不再像常规调用free()一样。

  • do-while(0) 让您可以像函数一样“调用”多行宏。这很好地解释了这一点:https://hownot2code.com/2016/12/05/do-while-0-in-macros/ (2认同)