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

前もって感謝します

4

2 に答える 2

9

はい。

へのすべての呼び出しにmallocは、に一致する呼び出しが必要freeです。

于 2012-05-24T18:09:33.213 に答える
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;
}

幸運を!

于 2012-05-24T18:42:37.590 に答える