使用malloc分配内存后,释放C语言中的内存空间

6

我有一个关于这段代码的问题:

typedef struct pop {
unsigned long int *np; // matrix
unsigned long int f;
long double fp; 
unsigned long int *R; // matrix
unsigned long int *C; // matrix
unsigned long int Dp;
unsigned long int Ds;
unsigned long int count;
struct popolazione *ptrTempLst; // pointer
struct popolazione *leftTree;  // left tree pointer
struct popolazione *rightTree; // right tree pointer
} Node; 

当我释放此结构体分配的空间时,我是否需要先释放结构体内部矩阵的指针?

例如:

 Node *ptr=(Node *) malloc(sizeOf(Node));
 ptr->np=(unsigned long int *)malloc(10*sizeOf(unsigned long int));

 /*code code code*/

 // is necessary: free(ptr->np); 

 free(ptr);

感谢您的提前帮助。

为什么不用编译器版本的类型替换“unsigned long int”,并包含<cstdint>呢? - Cole Tobin
2个回答

9
是的。
每次调用malloc都必须有一个对应的free调用。

因为mallocfree不知道Node。注意它们返回和接受void* - ikegami

6

没错。

为了避免自己踩坑,你可以考虑以下做法:

  1. 总是用free()释放申请的malloc/calloc内存
  2. 接下来将指针设置为NULL
  3. 使用专门的清理/销毁函数来保证内存清理的一致性

以下函数是确保你始终正确清理结构体、避免内存泄漏和意外释放已经释放过的内存而导致段错误的好方法:

int destroyNode(Node* myNode) {
  if(!myNode) {
    printf("Invalid pointer! Exiting");
    return (-1);
  }

  // Clear out memory
  if(np) {
    free(np);
    np = NULL;
  }
  if(R) {
    free(R);
    R = NULL;
  }
  if(C) {
    free(C);
    C = NULL;
  }
  if(ptrTempLst) {
    free(ptrTempLst);
    ptrTempLst = NULL;
  }
  if(leftTree) {
    free(leftTree);
    leftTree = NULL;
  }
  if(rightTree) {
    free(rightTree);
    rightTree = NULL;
  }

  free(myNode);
}

例如:

int main(void) {
  Node *tempNode = calloc((size_t)1,sizeof(Node));

  // Alloc the member nodes, etc, do some code


  // Ready to clean up and exit program
  destroyNode(tempNode);
  tempNode = NULL;

  return 0;
}

祝你好运!


1
if (...) free(...) 中的 if 是不必要的。free(NULL) 完全合法且有效。 - user703016
在某些操作系统(例如:Palm)上,您可能会遇到段错误。尽管C标准表明这是安全的,但最好先看清再跳。 - Cloud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接