2010-01-12 76 views
11

Tôi có một hàm phân bổ tùy chỉnh sử dụng sbrk() để lấy bộ nhớ. Làm cách nào để phát hành bộ nhớ này khi không còn cần thiết nữa?Làm cách nào để giải phóng bộ nhớ do sbrk()?

Có hàm nào tương đương với hàm free() cho malloc() không?

hoặc tôi có phải sử dụng brk() để đặt kết thúc phân đoạn dữ liệu không?

Trả lời

20

Bạn cần sử dụng lại brk hoặc sbrk để thu nhỏ lại.

Cuối cùng cách duy nhất bạn phải sửa đổi lượng bộ nhớ (ngoài mmap như syscalls), là tăng hoặc giảm heap, vì vậy bạn di chuyển nó lên với sbrk hoặc brk và bạn di chuyển xuống dưới brk hoặc sbrk với số gia tăng âm.

+4

-1, bạn có thể giảm bằng 'sbrk', chỉ cần chuyển giá trị âm. – avakar

+0

Bạn nói đúng, tôi sẽ chỉnh sửa nó. Không bao giờ sử dụng sbrk như thế, mát mẻ. –

+0

Tuyệt vời, tôi đã xóa bỏ phiếu giảm giá. – avakar

3

Không sử dụng brksbrk. Không thể biết được chức năng thư viện nào có thể gọi là malloc và có thể thay đổi theo thời gian, vì vậy ngay cả khi chương trình của bạn hoạt động ngay bây giờ, nó có thể bị hỏng khi ai đó nâng cấp libc. Họ bị loại khỏi POSIX vì một lý do rất tốt.

+2

người cho biết cấp phát của ông không phải là thứ duy nhất được sử dụng để phân bổ từ đống trong quá trình/ứng dụng của mình? nó có thể hoàn toàn hợp pháp. Xin vui lòng không chỉ nói một số tuyệt đối "làm và không" như nếu bạn biết tốt hơn cho tất cả mọi người trong mọi trường hợp. Lời giải thích của bạn là hoàn hảo nhưng nó cũng nói tại sao bạn sai (trường hợp anh ta không sử dụng malloc). –

+2

@ v.oddou: Làm sao anh biết 'printf' không dùng' malloc'? (Trên nhiều hệ thống thực, nó có!) Hoặc bất kỳ chức năng thư viện chuẩn nào khác? Đó là toàn bộ câu trả lời của tôi. "Tôi không sử dụng' malloc' "không phải là một điều kiện đủ để' brk' hoặc 'sbrk' được an toàn để sử dụng. Thực sự * không có đủ điều kiện * để chúng được an toàn. –

+0

điểm rất tốt. sẽ phục vụ một số hòa giải cho người dùng 'sbrk'. Bây giờ, nếu một người không sử dụng bất kỳ stdlib nào cả? hoặc tốt hơn, một stdlib tùy chỉnh mà cụ thể không sử dụng malloc. HOẶC EVEN, một thời gian chạy nối có thể hack chức năng malloc bằng cách thực hiện một số chuyển hướng bảng biểu tượng ảo thành một hàm tùy chỉnh? –

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