tl; dr: Không phải là cấp phát bộ nhớ động vốn không xác định (như bạn đã định nghĩa nó theo các đường dẫn thực thi giống hệt nhau); nó thường khiến chương trình của bạn không thể đoán trước được . Cụ thể, bạn không thể dự đoán liệu trình phân bổ có thể thất bại khi đối mặt với một chuỗi đầu vào tùy ý hay không.
Bạn có thể có một bộ phân bổ không xác định. Điều này thực sự phổ biến bên ngoài thế giới thời gian thực của bạn, nơi hệ điều hành sử dụng những thứ như ngẫu nhiên hóa bố cục địa chỉ. Tất nhiên, điều đó sẽ làm cho chương trình của bạn không có tính xác định.
Nhưng đó không phải là một trường hợp thú vị, vì vậy hãy giả sử một công cụ phân bổ hoàn toàn xác định: cùng một chuỗi phân bổ và phân bổ sẽ luôn dẫn đến các khối giống nhau ở cùng một vị trí và các phân bổ và phân bổ đó sẽ luôn có thời gian chạy giới hạn.
Bây giờ chương trình của bạn có thể xác định: cùng một tập hợp các đầu vào sẽ dẫn đến chính xác cùng một đường dẫn thực thi.
Vấn đề là nếu bạn đang phân bổ và giải phóng bộ nhớ để đáp ứng các đầu vào, bạn không thể dự đoán liệu một phân bổ có bao giờ thất bại hay không (và thất bại không phải là một tùy chọn).
Đầu tiên, chương trình của bạn có thể bị rò rỉ bộ nhớ. Vì vậy, nếu nó cần chạy vô thời hạn, cuối cùng một phân bổ sẽ không thành công.
Nhưng ngay cả khi bạn có thể chứng minh rằng không có rò rỉ, bạn sẽ cần biết rằng không bao giờ có một chuỗi đầu vào có thể đòi hỏi nhiều bộ nhớ hơn khả dụng.
Nhưng ngay cả khi bạn có thể chứng minh rằng chương trình sẽ không bao giờ cần nhiều bộ nhớ hơn khả dụng, trình cấp phát có thể, tùy thuộc vào trình tự cấp phát và giải phóng, phân mảnh bộ nhớ và do đó cuối cùng không thể tìm thấy một khối liền kề để đáp ứng cấp phát, mặc dù có đủ bộ nhớ trống về tổng thể.
Rất khó để chứng minh rằng không có trình tự đầu vào nào dẫn đến phân mảnh bệnh lý.
Bạn có thể thiết kế trình cấp phát để đảm bảo không có sự phân mảnh (ví dụ: bằng cách cấp phát các khối chỉ có một kích thước), nhưng điều đó đặt ra một hạn chế đáng kể đối với người gọi và có thể làm tăng dung lượng bộ nhớ cần thiết do lãng phí. Và người gọi vẫn phải chứng minh rằng không có rò rỉ và có giới hạn trên tương đối trên tổng bộ nhớ được yêu cầu bất kể trình tự đầu vào là gì. Gánh nặng này rất cao nên việc thiết kế hệ thống đơn giản hơn để nó không sử dụng phân bổ bộ nhớ động.