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

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

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

 int* ptr = (int*)malloc(sizeof(int)); free(ptr); ptr = NULL; 

你不能。 在free它之后,只需为它分配NULL ,以确保不释放它两次(可以free(NULL) )。

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

编辑

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

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

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

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


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

 #include  #include  #include  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; } 

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

 #define FREE(ptr) do{ \ free((ptr)); \ (ptr) = NULL; \ }while(0) 

然后,只要你确保你的代码只使用FREE()而不是free(),你就可以相信你写的代码不会释放两次相同的内存。 当然,这对于防止多次调用释放内存的库函数没有任何作用。 并没有什么可以保证每个malloc都有免费的。

你可以用一个函数来尝试这个,但是它变得很麻烦,因为你必须抛出一个引用操作符,它看起来不再是对free()的正常调用了。

你没有,因为你做不到。

跟踪从malloc()获得的指针,并且只释放那些,只有一次。

如果你愿意,内存没有内存,所以它不知道它是否被分配。 只有您的操作系统的内存管理器可以告诉您(但C不包含任何标准化的机制来查询此信息)。

我知道这个答案a little bit迟了,但我只是读了这个答案并编写了一些代码来validation以下内容:

Free将把内存块放在自己的空闲块列表中 。 通常它也会尝试将地址空间中的相邻块融合在一起。 空闲块列表只是一个内存块的循环列表,当然在开头有一些管理数据。 free-list也是第一个位置 ,malloc在需要时查找新的内存块。 它在从OS调用新内存之前进行扫描 。 当发现的块大于所需的内存时,它只分为两部分。 一个返回给调用者,另一个返回到空闲列表中。

此代码仅检查已分配的第一个指针是否已释放:

 int is_freed(void *p) { void * q; char p_addr [50]; char q_addr [50]; sprintf(p_addr, "%p", p); q = malloc (1); sprintf(q_addr, "%p", q); free (q); return ! strcmp(q_addr, p_addr); } 

我已经在HP-UX和Linux Redhat上测试了这个代码,它只适用于一个指针。