C免费和结构

时间:2011-07-16 22:54:45

标签: c pointers data-structures free

我的问题是关于释放先前用malloc()分配的内存块的C free()函数 如果我有一个结构数据类型由几个指针组成,每个指针指向不同的内存位置,如果我在结构上应用free()会对这些内存位置会发生什么?这些地点也会免费吗?或只是分配指针的内存块?

4 个答案:

答案 0 :(得分:23)

没有。他们不会被释放。你必须“手动”释放它们。 malloc对结构的内容一无所知(它根本不知道它是一个结构体,从它的角度来看它只是一块“记忆”)。

答案 1 :(得分:9)

如果你只释放结构,那么结构中指针所指向的内存将不会被释放(假设它是mallocd)。你应该先释放它们。

你可以使用valgrind(如果有的话)亲眼看看:

#include <stdlib.h>

struct resources{
   int * aint;
   double * adouble;
};                                                                              
int main(){

   int* someint = malloc(sizeof(int) * 1024);
   double* somedouble = malloc(sizeof(double)* 1024);

   struct resources *r  = malloc(sizeof(struct resources));

   r->aint = someint;
   r->adouble = somedouble;

   free (r);
   return 0;

}

$ gcc test_struct.c -o test
$ valgrind ./test
==9192== Memcheck, a memory error detector
==9192== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==9192== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==9192== Command: ./test
==9192== 
==9192== 
==9192== HEAP SUMMARY:
==9192==     in use at exit: 12,288 bytes in 2 blocks
==9192==   total heap usage: 3 allocs, 1 frees, 12,296 bytes allocated
==9192== 
==9192== LEAK SUMMARY:
==9192==    definitely lost: 12,288 bytes in 2 blocks
==9192==    indirectly lost: 0 bytes in 0 blocks
==9192==      possibly lost: 0 bytes in 0 blocks
==9192==    still reachable: 0 bytes in 0 blocks
==9192==         suppressed: 0 bytes in 0 blocks
==9192== Rerun with --leak-check=full to see details of leaked memory
==9192== 
==9192== For counts of detected and suppressed errors, rerun with: -v
==9192== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 12 from 7)

答案 2 :(得分:3)

struct Node
{
  struct Node *nextSibling;
  struct Node *prevSibling;
  struct Node *parentNode;
  ...
};
...
struct Node *rootNode;
/* Initialize `rootNode' and fill in its various fields;
   do the same with more nodes.  */

如果使用free(rootNode),它将只释放该单个节点的内存。换句话说,除非你在释放实际想要删除的节点所使用的内存之前释放它,否则你将分配一堆你无法释放的内存。

答案 3 :(得分:0)

为了澄清@Chrono Kitsune的答案,它仍然可以释放结构内部的指针,但它有风险。

free(rootNode)所做的实际上是告诉内存管理单元rootNode正在使用的内存空间不再被使用,并且对于需要它的任何其他内容来说都是公平的游戏。虽然rootNode仍指向同一位置,但它现在被视为无效指针,其内容可能已损坏,因为其位置现在可被其他内容覆盖。

如果您在释放后立即尝试访问rootNode可能工作,但无法保证,因此{{1}最安全其内容(在删除free之前已经malloc&#39; d)