2012-05-24 30 views
6

Tôi có một câu hỏi về mã này:miễn phí không gian được phân bổ trong c với malloc

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; 

Khi tôi không gian miễn phí phân bổ cho struct này, trước khi có tôi để giải phóng con trỏ đến ma trận bên trong struct?

Ví dụ,

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

Cảm ơn trước

+0

lý do tại sao bạn không thay thế "unsigned long int" bằng phiên bản của trình biên dịch và bao gồm '' –

Trả lời

6

Điều đó là chính xác.

Để giúp tránh chụp mình trong bàn chân, bạn có thể xem xét thực hiện những điều sau đây:

  1. Luôn miễn phí tất cả malloc/calloc'ed bộ nhớ với miễn phí()
  2. Sau đó, đặt con trỏ đến NULL
  3. Sử dụng dọn dẹp chuyên dụng/phá hủy chức năng để đảm bảo phù hợp bộ nhớ dọn dẹp

chức năng sau đây sẽ là một cách tốt để đảm bảo bạn luôn dọn dẹp một cấu trúc đúng cách, tránh rò rỉ bộ nhớ, và tránh vô tình giải phóng bộ nhớ đã-được giải phóng và gây ra một lỗi segmentation:

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

ví dụ:

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

Chúc may mắn!

+1

'if' trong' if (...) free (...) 'là không cần thiết. 'miễn phí (NULL)' là hoàn toàn hợp pháp và làm việc. –

+0

Trên một số hệ điều hành (ví dụ: Palm), bạn sẽ nhận được segfaults. Mặc dù tiêu chuẩn C cho thấy điều này là an toàn, tốt nhất để xem trước khi nhảy. – DevNull

9

Yes.

Mọi cuộc gọi đến malloc phải có cuộc gọi phù hợp với free.

+0

... vì 'malloc' và' free' không biết 'Node'. Chú ý rằng chúng quay trở lại và lấy 'void *'? – ikegami

Các vấn đề liên quan