使用malloc释放c中分配的空间

时间:2012-05-24 18:08:25

标签: c struct malloc free typedef

我对此代码有疑问:

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);

提前致谢

2 个答案:

答案 0 :(得分:9)

malloc的每次通话都必须与free匹配。

答案 1 :(得分:6)

这是正确的。

为了避免自己在脚下射击,您可以考虑以下做法:

  1. 始终使用free()
  2. 释放所有malloc / calloc的内存
  3. 然后,将指针设置为NULL
  4. 使用专用的清理/销毁功能来确保一致的内存清理
  5. 以下函数可以确保您始终正确清理结构,避免内存泄漏,并避免意外释放已释放的内存并导致分段错误:

    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;
    }
    
    祝你好运!