2014-10-31 3 views
2

나는 약. 내 컴퓨터에 2GB의 무료 DRAM.C++ 세그먼트 오류 std :: array

#include <iostream> 
#include <array> 

int main(int argc, char *argv[]){ 

    // int* a = new int[500000000]; 
    std::array<int, 2000000> a; 

} 

과 : 두 배열에 대한

$ g++ -std=c++11 main.cpp -o main 
./main 

작동하는 표준 : : 배열 또는 표준 배열 중 하나를 컴파일. 에 성병의 크기 : 배열 변경 : 솔직히

$ ./main 
Segmentation fault (core dumped) 

, 나는이 문제가 이미 어딘가에 해결되었는지의 여부를 확실하지 않다 :

// ceteris paribus 
std::array<int, 2095300> a; 

하는 리드.

내 이해에서 std :: array는 스택에 생성되고 int * ... 배열은 힙에 만들어집니다. 이제 내 생각 엔 제 스택이 단순히 8 메가 바이트보다 크지 않고, 2GB 힙이 불균형하게 들리는 것과 비교했을 것입니다. 따라서 나는 또한 시도했다 :

//int a[2096000]; 

또한 세그먼트 결함을 일으킨다. 그래서 내 질문은 무엇이 세그멘테이션 오류를 일으키는가?

미리 감사드립니다.

+2

스택 오버 플로우 가능성이 가장 높은 벡터를 사용하십시오. – Borgleader

+1

stackoverlow, 프로그램의 스택 크기를 늘립니다. –

+4

컴퓨터에 2GB RAM이있을 수 있지만 사용 가능한 스택 크기는 확실히 작습니다. –

답변

4

스택에 오버 헤드가 발생하여 스택에 큰 배열을 넣었습니다.

스택의 크기를 설정할 수 있습니다 : Change stack size for a C++ application in Linux during compilation with GNU compiler. 그러나 더 나은 옵션은 아마도 힙을 사용하는 것입니다.

는 단지 스택 너무 작은 [원문] 힙 다음 있음 약간 불균형 들렸다.

스택은 실제로 할당 된 메모리이므로 스택에 메모리가 사용되면 다른 용도로는 사용할 수 없으므로 스택이 실제로 필요한 것보다 커지는 것을 원하지 않습니다. 반면에 힙은 실제로 요청하지 않는 한 메모리를 차지하지 않으므로 힙을 잠재적으로 주소 공간의 많은 부분을 차지하도록 허용하는 것이 좋습니다.

함수 호출의 최대 깊이가 일반적으로 그렇게 높지 않기 때문에 스택도 일반적으로 매우 클 필요가 없습니다. 몇 메가 바이트는 거의 항상 충분합니다.

+0

스택을 이미 할당 할 필요는 없으며 메모리 공간 만 예약하면됩니다. 일부 시스템에서는 약간 다릅니다. 스택은 작아졌습니다. 역사적으로 메모리 공간은 실제로는 멀티 스레드 시스템에서 특히 값 비싼 상품 이었기 때문입니다. 그러나 몇 기가 바이트 또는 테라 바이트의 RAM이있는 64 비트 시스템에서는 더 이상 값 비싼 제품이 아닙니다. – Yakk