2010-07-29 17 views
7

thể trùng lặp:
Setting variable to NULL after free …Nó luôn luôn là một thực hành tốt để thiết lập con trỏ đến NULL sau khi miễn phí() - ing chúng?

Tôi đang tìm hiểu về thực hành lập trình C tốt và một người bạn của tôi nói với tôi luôn đặt con trỏ đến NULL sau miễn phí() ing họ (hay gọi một chức năng giải phóng cụ thể).

Ví dụ:

char* ptr = malloc(100); 
... 
free(ptr); 
ptr = NULL; 

hoặc

struct graph* graph = create_graph(); 
... 
destroy_graph(graph); 
graph = NULL; 

Tại sao điều này là một thực hành tốt?

Cập nhật: Sau khi đọc câu trả lời, có vẻ như là một thực tế khủng khiếp đối với tôi! Tôi đang ẩn các lỗi có thể có đôi() miễn phí. Làm thế nào điều này có thể là một thực hành tốt? Tôi bị sốc.

Cảm ơn, Boda Cydo.

+0

@bodacydo Hãy xem các câu hỏi "có liên quan" ở bên phải của trang. –

+0

Cảm ơn Neil và Michael. Câu hỏi đó thực sự trả lời câu hỏi của tôi. Sau khi đọc các câu trả lời tôi có một câu hỏi khác - không thiết lập con trỏ để NULL thực sự ẩn lỗi? Double free() không còn bị phát hiện nữa! Tôi bây giờ bối rối vì điều này thực sự che giấu những sai lầm khi hiển thị. – bodacydo

+1

Bằng cách nào? Giải phóng con trỏ và đặt nó thành NULL cho phép bộ nhớ được giải phóng. Nếu sau đó bạn quyết định miễn phí NULL, bạn sẽ nhận được một khẳng định hoặc một số cảnh báo khác.Bộ nhớ giải phóng đôi là khó khăn hơn nhiều để theo dõi hơn giải phóng NULL. –

Trả lời

2

Bỏ phiếu thực hành xấu từ tôi. Nếu bạn làm muốn gán giá trị, hãy đặt giá trị đó thành (void *) 0xdeadbeef. Kiểm tra những gì CRT của bạn có thể làm đầu tiên mặc dù. Trình phân bổ gỡ lỗi thích hợp sẽ đặt bộ nhớ được giải phóng thành một mẫu có khả năng gây ra bom khi con trỏ được sử dụng sau khi nó được giải phóng. Mặc dù nó không được bảo đảm. Nhưng sau đó không thay đổi giá trị con trỏ là giải pháp tốt hơn (và nhanh hơn).

-5

Tôi nghĩ có ...

Khi bạn đã hoàn thành việc sử dụng một phần của menory, chúng ta nên giải phóng() it.This cho phép bộ nhớ được giải phóng để được sử dụng cho một số mục đích khác ... như malloc hơn nữa () cuộc gọi.

miễn phí mất một con trỏ vào bộ nhớ như một cuộc tranh cãi và giải phóng bộ nhớ mà con trỏ dùng để chỉ ...

Hope this helps ... :)

+5

-1: Điều này không trả lời được câu hỏi. bodacydo không hỏi, liệu anh ta có nên tự do nhớ không. Anh ta hỏi, liệu anh ta có nên đặt con trỏ tới NULL sau khi giải phóng nó không. –

6

này được coi là một thực hành tốt bởi một số vì nó ngăn cản bạn vô tình truy cập vào bộ nhớ sau khi nó đã được miễn phí() ed.

+1

Sau khi đọc câu trả lời, tôi thấy đó là một thực hành không tốt - tôi đang ẩn các lỗi không có đôi! Làm thế nào điều này có thể là một thực hành tốt? – bodacydo

+1

Trên thực tế, nó không tự động ngăn bạn truy cập vào nó, nhưng bạn có thể (và nên) luôn kiểm tra con trỏ NULL, nhưng bạn không thể biết con trỏ NULL có hợp lệ hay không. Vì vậy nó là thực hành tốt. – cypheon

+0

Tôi chưa tin rằng đó là một thực hành tốt. – bodacydo

13

Trong khi nó không thể làm tổn thương, nó không phải luôn luôn giúp đỡ. Vấn đề cần xem xét là dễ dàng cho việc có nhiều bản sao của con trỏ và rất có thể bạn sẽ chỉ thiết lập một bản sao cho NULL. Các ví dụ điển hình về nơi nó không giúp gì cả là:

void free_graph(graph *g) 
{ 
    ... 
    free(g); 
    g = NULL; // not useful in this context 
} 

Vấn đề ở đây là bạn chỉ được thiết lập con trỏ đó là địa phương để free_graph để NULL và con trỏ được tổ chức bởi người gọi của free_graph sẽ vẫn có giá trị ban đầu.

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