답변:
여기에 스택 오버플로가 발생했을 것입니다. 배열이 너무 커서 프로그램의 스택 주소 공간에 맞지 않습니다.
힙에 배열을 할당하면 컴퓨터에 충분한 메모리가 있다고 가정하면 문제가 없습니다.
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;
}
delete
할당 하는 모든 곳에서 좋은 습관 입니다 new
. 그러나 메모리를 한 번만 할당한다고 확신하는 경우 (메인에서와 같이) 엄격하게 필요하지 않습니다. 메모리는 명시 적 없이도 main 종료시 해제됩니다 delete
.
또한 대부분의 UNIX 및 Linux 시스템에서 실행중인 경우 다음 명령을 사용하여 일시적으로 스택 크기를 늘릴 수 있습니다.
ulimit -s unlimited
그러나 조심하십시오. 기억은 제한된 자원이며 큰 힘으로 큰 책임이 따릅니다. :)