2009-12-26 34 views
14

thể trùng lặp:
C programming : How does free know how much to free?Làm thế nào để miễn phí() biết bao nhiêu bộ nhớ để deallocate?

Khi lập trình trong C, tôi thường sử dụng malloc() để cấp phát bộ nhớ và free() để phát hành nó:

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects); 
/** Do stuff **/ 
free(objArr); 

như thế nào free() biết bao nhiêu bộ nhớ để deallocate? malloc() có tạo một bảng ở đâu đó để ghi nhớ con trỏ và mỗi con trỏ trỏ đến bao nhiêu bộ nhớ không?

Nếu đúng như vậy, free() sẽ thất bại nếu tôi đổi tên con trỏ? ví dụ:

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects); 
MyObject* newPtr= objArr; 
free(newPtr); /** Does this fail? **/ 

Điều gì sẽ xảy ra nếu tôi tăng con trỏ và sau đó chạy free()? ví dụ:

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects); 
newPtr++; 
free(newPtr); /** What happens now? **/ 

Nó sẽ giải quyết một đoạn bộ nhớ bổ sung ngay từ cuối mảng gốc?

+3

Bản sao của http://stackoverflow.com/questions/1518711/c-programming-how-does-free-know-how-much-to-free – codaddict

Trả lời

19

Cách thông dụng nhất là nó lưu trữ một số thông tin ngay trước khi địa chỉ trả lại cho bạn. Vì vậy, nếu malloc trả về địa chỉ 0x1004, nội bộ, malloc sẽ đặt sang một bên bộ nhớ bắt đầu tại 0x0FFC và sẽ lưu trữ các thông tin khác nhau như kích thước ở đâu đó trong bộ nhớ giữa 0xFFC - 0x1003 nhưng ứng dụng sẽ được thông báo bắt đầu phân bổ tại 0x1004.

Điều duy nhất quan trọng là miễn phí là nhận được chính xác địa chỉ giống như những gì malloc trả lại.

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