교수님들이 중요한 점을 제기하고 있습니다. 불행히도 영어 용법은 그들이 말한 내용을 절대적으로 확신하지 못합니다. 특정 메모리 사용 특성이 있고 개인적으로 작업 한 장난감이 아닌 프로그램에 대한 질문에 대답하겠습니다.
일부 프로그램은 잘 작동합니다. 그들은 반복적 인 주기로 많은 중소 규모 할당에 이어 많은 여유 공간이 뒤 따르는 웨이브 형태로 메모리를 할당합니다. 이러한 프로그램에서 일반적인 메모리 할당자는 잘 수행합니다. 그들은 해제 된 블록을 통합하고 웨이브의 끝에서 대부분의 사용 가능한 메모리는 큰 연속 청크에 있습니다. 이러한 프로그램은 매우 드뭅니다.
대부분의 프로그램은 잘못 작동합니다. 매우 작은 것부터 매우 큰 것까지 다양한 크기로 메모리를 다소 무작위로 할당 및 할당 해제하며 할당 된 블록의 높은 사용량을 유지합니다. 이러한 프로그램에서 블록을 통합하는 기능은 제한적이며 시간이 지남에 따라 매우 조각화되고 상대적으로 인접하지 않은 메모리로 완료됩니다. 32 비트 메모리 공간에서 총 메모리 사용량이 약 1.5GB를 초과하고 10MB 이상의 할당이있는 경우 결국 큰 할당 중 하나가 실패합니다. 이러한 프로그램은 일반적입니다.
다른 프로그램은 중지 될 때까지 메모리를 거의 또는 전혀 사용하지 않습니다. 실행 중에 점진적으로 메모리를 할당하여 소량 만 확보 한 다음 중지하면 모든 메모리가 해제됩니다. 컴파일러는 이와 같습니다. VM도 마찬가지입니다. 예를 들어, C ++로 작성된 .NET CLR 런타임은 아마도 메모리를 해제하지 않을 것입니다. 왜 그래야합니까?
이것이 최종 답입니다. 프로그램의 메모리 사용량이 충분히 많은 경우 malloc 및 free를 사용하여 메모리를 관리하는 것은 문제에 대한 충분한 대답이 아닙니다. 잘 동작하는 프로그램을 다룰 수있을만큼 운이 좋지 않다면 큰 메모리 청크를 미리 할당 한 다음 선택한 전략에 따라 하위 할당하는 하나 이상의 사용자 지정 메모리 할당자를 디자인해야합니다. 프로그램이 중지되는 경우를 제외하고는 무료로 사용할 수 없습니다.
교수님의 말을 정확히 알지 못한 상태에서 진정한 생산 규모 프로그램을 위해서는 아마도 그들 편이 될 것입니다.
편집하다
몇 가지 비판에 답해 보도록하겠습니다. 분명히 SO는 이런 종류의 게시물에 적합하지 않습니다. 분명하게 말하면, 저는 두 개의 컴파일러를 포함하여 이런 종류의 소프트웨어를 작성한 경험이 약 30 년입니다. 나는 학문적 언급이없고 단지 내 타박상 만 있습니다. 훨씬 좁고 짧은 경험을 가진 사람들로부터 비판이 오는 것을 느낄 수 없습니다.
내 핵심 메시지를 반복하겠습니다. malloc과 free의 균형을 맞추는 것은 실제 프로그램에서 대규모 메모리 할당에 대한 충분한 해결책 이 아닙니다 . 블록 병합은 정상이며 시간을 벌지 만 충분 하지 않습니다. 당신은 심각하고 영리한 메모리 할당자가 필요합니다.이 할당자는 메모리를 덩어리 (malloc 등을 사용하여)로 잡고 거의 무료로 사용하는 경향이 있습니다. 이것은 아마도 OP의 교수들이 염두에 두었던 메시지 일 것입니다.