Các giáo sư của bạn đang nêu ra một điểm quan trọng. Thật không may, cách sử dụng tiếng Anh là như vậy mà tôi không hoàn toàn chắc chắn những gì họ nói. Hãy để tôi trả lời câu hỏi về các chương trình không phải đồ chơi có các đặc điểm sử dụng bộ nhớ nhất định và cá nhân tôi đã làm việc với.
Một số chương trình hoạt động tốt. Chúng phân bổ bộ nhớ theo từng đợt: rất nhiều phân bổ cỡ nhỏ hoặc trung bình, theo sau là rất nhiều giải phóng, trong các chu kỳ lặp lại. Trong các chương trình này, các trình cấp phát bộ nhớ điển hình hoạt động khá tốt. Chúng kết hợp các khối được giải phóng và khi kết thúc wave, phần lớn bộ nhớ trống nằm trong các khối lớn liền kề. Những chương trình này khá hiếm.
Hầu hết các chương trình hoạt động không tốt. Chúng phân bổ và phân bổ bộ nhớ ít nhiều một cách ngẫu nhiên, với nhiều kích cỡ khác nhau từ rất nhỏ đến rất lớn và chúng duy trì mức sử dụng cao các khối được cấp phát. Trong các chương trình này, khả năng kết hợp các khối bị hạn chế và theo thời gian, chúng kết thúc với bộ nhớ bị phân mảnh cao và tương đối không liền kề. Nếu tổng mức sử dụng bộ nhớ vượt quá khoảng 1,5GB trong không gian bộ nhớ 32-bit và có phân bổ (giả sử) 10MB trở lên, cuối cùng một trong những phân bổ lớn sẽ không thành công. Các chương trình này là phổ biến.
Các chương trình khác giải phóng ít hoặc không có bộ nhớ cho đến khi chúng dừng lại. Chúng dần dần phân bổ bộ nhớ trong khi chạy, chỉ giải phóng một lượng nhỏ, sau đó dừng lại, lúc đó tất cả bộ nhớ được giải phóng. Một trình biên dịch là như thế này. VM cũng vậy. Ví dụ, thời gian chạy .NET CLR, bản thân nó được viết bằng C ++, có thể không bao giờ giải phóng bất kỳ bộ nhớ nào. Tại sao nên làm thế?
Và đó là câu trả lời cuối cùng. Trong những trường hợp chương trình sử dụng bộ nhớ quá lớn, thì việc quản lý bộ nhớ bằng cách sử dụng malloc và miễn phí không phải là câu trả lời đầy đủ cho vấn đề. Trừ khi bạn đủ may mắn để xử lý một chương trình hoạt động tốt, bạn sẽ cần thiết kế một hoặc nhiều trình cấp phát bộ nhớ tùy chỉnh để phân bổ trước các phần lớn bộ nhớ và sau đó phân bổ phụ theo chiến lược bạn chọn. Bạn hoàn toàn không được sử dụng miễn phí, ngoại trừ khi chương trình dừng lại.
Nếu không biết chính xác những gì các giáo sư của bạn nói, đối với những chương trình có quy mô sản xuất thực sự, tôi có thể sẽ đứng về phía họ.
BIÊN TẬP
Tôi sẽ trả lời một số lời chỉ trích. Rõ ràng SO không phải là một nơi tốt cho những bài viết kiểu này. Chỉ cần nói rõ: Tôi đã có khoảng 30 năm kinh nghiệm viết loại phần mềm này, bao gồm một vài trình biên dịch. Tôi không có tài liệu tham khảo về học thuật, chỉ là vết bầm tím của chính tôi. Tôi không thể không cảm thấy những lời chỉ trích đến từ những người có kinh nghiệm hạn hẹp hơn và ngắn hơn.
Tôi sẽ nhắc lại thông điệp chính của mình: cân bằng giữa malloc và free không phải là giải pháp đủ để phân bổ bộ nhớ quy mô lớn trong các chương trình thực. Liên kết khối là điều bình thường và sẽ tốn thời gian, nhưng nó không đủ. Bạn cần các trình phân bổ bộ nhớ nghiêm túc, thông minh, có xu hướng lấy bộ nhớ theo từng phần (sử dụng malloc hoặc bất cứ thứ gì) và hiếm khi miễn phí. Đây có lẽ là thông điệp mà các giáo sư của OP đã nghĩ đến, mà ông ấy đã hiểu nhầm.