2013-04-25 37 views
7

Khối sau gây ra rò rỉ bộ nhớ:Tôi có cần gọi miễn phí() sau một đường dây bị lỗi() không?

FILE *fp = fopen(path, "r"); 
char *line = NULL; 
size_t len = 0; 
ssize_t read = -1; 

while ((read = getline(&line, &len, fp)) != -1) { 
     /*Do something*/ 
} 

120 byte trong 1 khối chắc chắn bị mất ...

... getline (getline.c: 34)

Tôi có thể sửa lỗi này bằng cách thêm một số free():

while ((read = getline(&line, &len, fp)) != -1) { 
     /*Do something*/ 
} 
free(line); 

Câu hỏi của tôi là: Tại sao getline cấp phát bộ nhớ cho line khi không thành công? Và tại sao tôi không cần phải free(line) cho mỗi cuộc gọi đến getline?

Trả lời

9

Thiết lập sao cho bạn có thể chuyển khối bộ nhớ đã phân bổ trước đó đến getline() và thiết bị sẽ phân bổ nhiều hơn (realloc()) nếu cần. (Hoặc bạn có thể bắt đầu với không có bộ nhớ được phân bổ, như ở đây.) Nó có thể báo cáo thất bại hoặc EOF, nhưng không giải phóng không gian đã được cấp phát - do đó bạn cần phải giải phóng nó. Nếu tệp là một tệp rỗng và bạn bắt đầu không có dữ liệu, bạn có thể không nhận được bất kỳ không gian nào được phân bổ; mặt khác, nó có thể đã phân bổ một số không gian trước khi nó cố gắng lấy dữ liệu từ tệp.

Nhưng bạn biết rằng nếu con trỏ line không phải là rỗng, nó được cấp phát và phải được giải phóng.

+4

+1 'man 3 getline', mặc dù khá mơ hồ, không đảm bảo về việc phải * thành công * để cấp phát bộ đệm. Nó chỉ đơn giản là đọc * "Nếu * lineptr là NULL, sau đó' getline() 'sẽ cấp phát một bộ đệm để lưu trữ các dòng, mà nên được giải phóng bởi chương trình người dùng." * – WhozCraig

2

tuyến đường có thể bị lỗi theo nhiều cách khác nhau và có thể có hoặc không được cấp lại cho bộ nhớ một hoặc nhiều lần khi không thành công. Để nhất quán, nó không bao giờ giải phóng bộ nhớ - hãy xem một triển khai có thể có tại http://www.opensource.apple.com/source/cvs/cvs-19/cvs/lib/getline.c

Tính nhất quán này giúp dễ dàng hơn cho cả việc triển khai và cho người gọi ... bạn luôn luôn miễn phí dòng chứ không phải kiểm tra lỗi mã để xem có giải phóng nó hay không.

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