사용 가능한 메모리의 "큰"(32 바이트) 확장이 있다고 상상해보십시오.
----------------------------------
| |
----------------------------------
이제 그 중 일부를 할당하십시오 (5 개의 할당).
----------------------------------
|aaaabbccccccddeeee |
----------------------------------
이제 첫 번째 네 개의 할당을 해제하고 다섯 번째는 할당하지 마십시오.
----------------------------------
| eeee |
----------------------------------
이제 16 바이트를 할당하십시오. 거의 두 배나 많은 공짜가 있어도 할 수 없습니다.
가상 메모리가있는 시스템에서는 조각화가 생각보다 문제가 되지 않습니다 . 큰 할당 은 물리적 주소 공간이 아닌 가상 주소 공간 에서만 인접해야하기 때문 입니다. 예를 들어, 페이지 크기가 2 바이트 인 가상 메모리가 있으면 아무런 문제없이 16 바이트를 할당 할 수 있습니다. 실제 메모리는 다음과 같습니다.
----------------------------------
|ffffffffffffffeeeeff |
----------------------------------
반면 가상 메모리 (훨씬 더 큰)는 다음과 같습니다.
------------------------------------------------------...
| eeeeffffffffffffffff
------------------------------------------------------...
메모리 조각화의 고전적인 증상은 큰 블록을 할당하려고 시도하는데 메모리가 충분하지 않은 것처럼 보일 수는 없다는 것입니다. 또 다른 가능한 결과는 프로세스가 메모리를 OS로 다시 릴리스 할 수 없다는 것입니다 (이들 블록은 현재 대부분 사용되지 않더라도 OS에서 할당 한 모든 블록에서 여전히 사용중인 객체가 있기 때문에).
C ++에서 메모리 조각화를 방지하는 전술은 크기 및 / 또는 예상 수명에 따라 다른 영역의 객체를 할당하여 작동합니다. 따라서 많은 객체를 생성하고 나중에 모두 함께 파괴하려면 메모리 풀에서 할당하십시오. 그 사이에 다른 할당은 풀에서 나오지 않으므로 메모리에서 할당 사이에 위치하지 않으므로 결과적으로 메모리가 조각화되지 않습니다.
일반적으로 프로그램이 오래 실행되고 많은 할당 및 해제를 수행하지 않는 한 크게 걱정할 필요가 없습니다. 가장 위험에 처한 단기 및 장기 개체의 혼합이있을 때에도 malloc
도움을주기 위해 최선을 다할 것입니다. 기본적으로 프로그램에 할당 실패가 발생하거나 예기치 않게 시스템의 메모리가 부족해질 때까지 무시하십시오 (기본 설정은 테스트 중입니다).
표준 라이브러리는 메모리를 할당하는 다른 것보다 나쁘지 않으며 표준 컨테이너에는 모두 Alloc
필요한 경우 할당 전략을 미세 조정하는 데 사용할 수 있는 템플릿 매개 변수가 있습니다.