Câu trả lời:
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:
free
'dNế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 .
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ổ.
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 new
toá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.
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.
Đó 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.
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ỏ.