2013-09-28 3 views
2

상당히 큰 청크 (또는 청크) - 몇 기가 바이트의 메모리를 할당해야합니다.동적 메모리 할당에 대한 제한

terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc

이 괜찮 :

float* d = new float[532000000]; 

그러나 나는 이상 532,000,000 요소 (~ 2 GB)의 플로트 배열을 할당하려고하면, 나는 런타임 오류 나쁜 (bad_alloc 뿐이다 예외) :

float* d = new float[533000000]; 

가 그럼 난 할당하려 첫번째 배열 외에 다른 배열. 두 번째 최대 크기는 float 배열은 요소 (~ 748 Mb)임을 확인했습니다.

이 괜찮 :

float* d = new float[532000000]; 
float* e = new float[196000000]; 

이 나쁜입니다 :

float* d = new float[532000000]; 
float* e = new float[197000000]; 

내가 어떤 응용 프로그램에서 할당 된 메모리에 제한이 어떻게 그들을 피하기 위해 알고 싶습니다? 어떻게 가상 메모리를 사용할 수 있습니까?

내 시스템 - 32 비트 우분투 12.10, 컴파일러 - GCC 4.7, RAM - 8기가바이트 (~ 6.5 기가 무료)

+0

32 비트 또는 64 비트 플랫폼에서 실행하고 있습니까? –

+0

주소 공간 조각화 문제처럼 보입니다. 이는 32 비트 플랫폼임을 강력히 시사합니다. – Mysticial

+0

@OliCharlesworth, 32 비트 (주제에 추가됨) – gorill

답변

5

당신은 가상 주소 공간의 한계를 공격; (비록 OS가 36 비트 포인터를 사용하여 PAE를 통해 액세스 할 수있는) 충분한 물리적 RAM을 가지고 있더라도 32 비트 시스템에서 각 프로세스는 여전히 32 비트 가상 주소 공간을 가지고 있기 때문에 각 프로세스가 매핑 할 수 없음을 의미합니다 메모리에 4GB 이상의 메모리가 있습니다.

일반적으로 가상 주소 공간의 상반부 (또는 상위 1GB는 커널 설정에 따라 다름)가 커널 용으로 예약 되었기 때문에 일반적으로 할당 제한이 ~ 2GB로 설정되고 가상 주소 공간 단편화로 인해이 수치가 낮아질 수 있습니다.

여러 가지 해결 방법이 있습니다 (예 : Windows에서 한 번에 4GB보다 큰 메모리 매핑 파일을 사용하여 한 번에 그 중 일부만 매핑 할 수 있으며 Linux에서도 동일하게 수행 할 수 있음). 그러나 현재 가장 단순합니다 솔루션은 64 비트 OS로 옮겨서 64 비트 응용 프로그램을 다시 컴파일하는 것입니다.

+0

* 64 비트 OS로 이동 * 프로세스가 여전히 32 비트 인 경우이 기능이 작동합니까? –

+0

@ ta.speot.is : 조금 더 많은 호흡 공간을 제공 할 수 있습니다 (OS 항목은 상반부의 64 비트 가상 주소 공간으로 이동하므로 사용자 프로세스가 전체 32 비트 가상 주소 공간을 차지할 수 있음). 실제로 64 비트 주소 공간의 이점은 프로그램을 64 비트 용으로 다시 컴파일해야한다는 것입니다. –

+0

64 비트 시스템에 제한이 있습니까? 사용 가능한 모든 실제 메모리를 사용할 수 있습니까? – gorill

관련 문제