[c++] 대형 어레이 크기의 세분화 오류
다음 코드는 2Gb 시스템에서 실행될 때 분할 오류를 제공하지만 4GB 시스템에서 작동합니다.
int main()
{
int c[1000000];
cout << "done\n";
return 0;
}
어레이의 크기는 4Mb에 불과합니다. C ++에서 사용할 수있는 배열의 크기에 제한이 있습니까?
답변
여기에 스택 오버플로가 발생했을 것입니다. 배열이 너무 커서 프로그램의 스택 주소 공간에 맞지 않습니다.
힙에 배열을 할당하면 컴퓨터에 충분한 메모리가 있다고 가정하면 문제가 없습니다.
int* array = new int[1000000];
그러나 이렇게 delete[]
하려면 배열 이 필요하다는 것을 기억하십시오 . 더 나은 해결책은 std::vector<int>
1000000 요소 를 사용 하고 크기를 조정하는 것입니다.
답변
C 또는 C ++에서 로컬 개체는 일반적으로 스택에 할당됩니다. 스택에서 처리 할 수있는 것보다 더 많은 큰 배열을 스택에 할당하므로 스택 오버플로 가 발생합니다 .
스택에 로컬로 할당하지 말고 대신 다른 장소를 사용하십시오. 이는 객체를 전역으로 만들 거나 전역 힙 에 할당 하여 수행 할 수 있습니다 . 다른 컴파일 단위에서를 사용하지 않으면 전역 변수가 괜찮습니다. 이것이 우연히 발생하지 않도록하려면 정적 저장소 지정자를 추가하고 그렇지 않으면 힙을 사용하십시오.
이것은 힙의 일부인 BSS 세그먼트에 할당됩니다.
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
이는 힙의 일부인 DATA 세그먼트에 할당됩니다.
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
이것은 힙의 지정되지 않은 위치에 할당됩니다.
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
답변
또한 대부분의 UNIX 및 Linux 시스템에서 실행중인 경우 다음 명령을 사용하여 일시적으로 스택 크기를 늘릴 수 있습니다.
ulimit -s unlimited
그러나 조심하십시오. 기억은 제한된 자원이며 큰 힘으로 큰 책임이 따릅니다. 🙂
답변
이 경우 배열이 스택에 할당되고 있으며이 경우 alloc을 사용하여 동일한 크기의 배열을 할당하려고합니다.