Cha*_*had 31
你不能.跟踪这个的方法是将指针指向0或NULL释放它.然而正如Fred Larson所提到的,这对指向同一位置的其他指针没有任何作用.
int* ptr = (int*)malloc(sizeof(int));
free(ptr);
ptr = NULL;
Run Code Online (Sandbox Code Playgroud)
cni*_*tar 27
你不能.只需NULL在它之后分配free它,以确保你没有释放它两次(没关系free(NULL)).
更好的是,如果可能的话,不要在你忘记"已经释放"的地方编写代码.
解释问题是如何找出指针所指向的内存是否已被释放:你不能这样做.你必须自己做簿记.
ken*_*ytm 15
没有可靠的方法来判断指针是否已被释放,正如Greg评论的那样,释放的内存可能会被其他无关数据占用而你会得到错误的结果.
事实上,没有标准方法来检查指针是否被释放.也就是说,glibc确实有函数(mcheck,mprobe)来查找用于堆一致性检查的指针的malloc状态,其中一个是查看指针是否被释放.
但是,这些函数主要用于调试,并且它们不是线程安全的.如果您不确定要求,请避免使用这些功能.只要确保你配对malloc/ free.
#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)
您可以通过编写为您分配指针的宏来扩展将NULL分配给指针值的概念。例如:
#define FREE(ptr) do{ \
free((ptr)); \
(ptr) = NULL; \
}while(0)
Run Code Online (Sandbox Code Playgroud)
然后,只要确保您的代码仅使用FREE()而不使用free(),您就可以确信自己编写的代码不会两次释放相同的内存。当然,这不会阻止多次调用释放内存的库函数。它并不能保证每个malloc都有一个免费的。
您可以使用函数来尝试此操作,但是它变得笨拙,因为您必须抛出引用运算符,而且它看起来不再像常规调用free()一样。