Heap bộ nhớ là gì?


Câu trả lời:


234

Có lẽ bạn có nghĩa là heap từ quan điểm cấp phát bộ nhớ, không phải từ quan điểm cấu trúc dữ liệu (thuật ngữ này có nhiều ý nghĩa).

Một lời giải thích rất đơn giản là heap là một phần của bộ nhớ trong đó bộ nhớ được cấp phát động (tức là bộ nhớ được cấp phát qua malloc). Bộ nhớ được phân bổ từ heap sẽ vẫn được phân bổ cho đến khi một trong những điều sau đây xảy ra:

  1. Bộ nhớ là free'd
  2. Chương trình chấm dứt

Nếu tất cả các tham chiếu đến bộ nhớ được phân bổ bị mất (ví dụ: bạn không lưu trữ một con trỏ tới nó nữa), bạn có cái được gọi là rò rỉ bộ nhớ . Đây là nơi bộ nhớ vẫn được phân bổ, nhưng bạn không có cách nào dễ dàng truy cập nó nữa. Bộ nhớ bị rò rỉ không thể được thu hồi để phân bổ bộ nhớ trong tương lai, nhưng khi chương trình kết thúc, bộ nhớ sẽ được hệ điều hành giải phóng.

Tương phản điều này với bộ nhớ ngăn xếp , nơi các biến cục bộ (được xác định trong một phương thức) sống. Bộ nhớ được phân bổ trên ngăn xếp thường chỉ tồn tại cho đến khi hàm trả về (có một số ngoại lệ cho điều này, ví dụ: các biến cục bộ tĩnh).

Bạn có thể tìm thêm thông tin về heap trong bài viết này .


3
Làm thế nào các biến cục bộ có thể sống trong một ngăn xếp? Một ngăn xếp chỉ cho phép lấy một biến tại một thời điểm theo một thứ tự rất cụ thể. Điều gì xảy ra nếu tôi cần một biến cục bộ từ một nơi nào đó thấp hơn trên ngăn xếp?
CodyBugstein

9
@Imray - trong một ngôn ngữ gõ tĩnh, kích thước của các tham số cục bộ được biết tại thời điểm biên dịch. Do đó, các biến cục bộ có thể được truy cập trực tiếp từ ngăn xếp thông qua phần bù địa chỉ. Không cần phải bật ngăn xếp để làm điều này. Xem câu trả lời này để biết thêm chi tiết.
LeopardSkinPillBoxHat

17

Một đống bộ nhớ là một vị trí trong bộ nhớ nơi bộ nhớ có thể được phân bổ khi truy cập ngẫu nhiên.
Không giống như ngăn xếp nơi bộ nhớ được phân bổ và giải phóng theo thứ tự rất xác định, các phần tử dữ liệu riêng lẻ được phân bổ trên heap thường được phát hành theo cách không đồng bộ với nhau. Bất kỳ yếu tố dữ liệu nào như vậy đều được giải phóng khi chương trình giải phóng rõ ràng con trỏ tương ứng và điều này có thể dẫn đến một đống bị phân mảnh. Trong dữ liệu đối lập chỉ có dữ liệu ở trên cùng (hoặc dưới cùng, tùy thuộc vào cách thức hoạt động của ngăn xếp) có thể được giải phóng, dẫn đến yếu tố dữ liệu được giải phóng theo thứ tự ngược lại mà chúng được phân bổ.


9

Heap chỉ là một khu vực nơi bộ nhớ được phân bổ hoặc giải phóng mà không có bất kỳ trật tự nào. Điều này xảy ra khi một người tạo một đối tượng bằng cách sử dụng newtoán tử hoặc một cái gì đó tương tự. Điều này trái ngược với stack nơi bộ nhớ được giải quyết trên cơ sở đầu tiên trong cơ sở cuối cùng.


8

Một đống bộ nhớ là một cấu trúc phổ biến để giữ bộ nhớ được phân bổ động. Xem Dynamic_memory_allocation trên wikipedia.

Có các cấu trúc khác, như hồ bơi, ngăn xếp và cọc.


7

Đó là một đoạn bộ nhớ được cấp phát từ hệ điều hành bởi trình quản lý bộ nhớ được sử dụng bởi một tiến trình. Các cuộc gọi đến malloc()et alia sau đó lấy bộ nhớ từ đống này thay vì phải trực tiếp xử lý hệ điều hành.


7

Bạn có thể có nghĩa là bộ nhớ heap, không phải bộ nhớ heap.

Bộ nhớ heap về cơ bản là một nhóm bộ nhớ lớn (thường là trên mỗi tiến trình) mà từ đó chương trình đang chạy có thể yêu cầu các khối. Điều này thường được gọi là phân bổ động .

Nó khác với Stack, nơi "biến tự động" được phân bổ. Vì vậy, ví dụ, khi bạn xác định trong hàm C một biến con trỏ, đủ không gian để giữ địa chỉ bộ nhớ được phân bổ trên ngăn xếp. Tuy nhiên, bạn thường sẽ cần phân bổ động không gian (Với malloc) trên heap và sau đó cung cấp địa chỉ nơi đoạn bộ nhớ này bắt đầu cho con trỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.